为什么我在这两个查询中得到不同的结果?
查询 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?
方法。我仍然无法确认这一点,我只是猜测(也许它甚至取决于实现和表引擎,我不知道(。