使用的不同结果包括? 和之间? 对于同一日期范围 Rails 5



为什么我在这两个查询中得到不同的结果?

查询 1 = false(创建班次 ID 数组,然后检查班次 ID 是否在数组中(:

shifts = Shift.where('date_time BETWEEN ? AND ?', Time.zone.now - 3.hours, Time.zone.now + 24.hours).pluck(:id)
shifts.include?(16923) # false

查询 2 = true(检查班次date_time是否在时间范围之间(:

Shift.find(16923).date_time.between?(Time.zone.now - 3.hours, Time.zone.now + 24.hours) # true

属性date_time是一个字符串,这和它有什么关系吗?

在撰写本文时,以下是当前结果:

Shift.find(16923).date_time="2018-09-01T07:45:00+00:00"

Time.zone.now - 3.hours=Fri, 31 Aug 2018 13:34:07 BST +01:00

Time.zone.now + 24.hours=Sat, 01 Sep 2018 16:35:22 BST +01:00

在我看来,它介于这两个范围之间,那么为什么它不包含在第一个数组中呢?

date_time

是字符串对象还是日期时间对象? 这可能是问题所在。

因为 String 和 Datetime 对象都接受between?方法,这两种方法都是从 Comparable https://apidock.com/ruby/Comparable/between%3F

字符串将在阿尔法伦理上进行比较

'11'.between?('0','2') # => true

DateTime 对象将在表示为整数并按顺序比较的 Time 对象上调用between?

11.between?(0,2) # => false

如果date_time是一个字符串,我建议将其更改为 DATETIME 列类型,它在语义上更有意义。如果无法更改它,可以添加自定义 getter 以返回解析字符串的 DateTime 对象。

def date_time
DateTime.parse(self[:date_time])
end

我对SQL运算符和它的优化不是那么熟悉,但我猜它通常比较两者,这可以解释为什么查询有效而不是between?方法。我仍然无法确认这一点,我只是猜测(也许它甚至取决于实现和表引擎,我不知道(。

最新更新