为什么在这两个查询中得到不同的结果?
查询1 =否(创建班次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 =真(检查轮班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
在我看来,它在这两个范围之间,为什么它不包含在第一个数组中?
答案 0 :(得分:0)
date_time
是String还是DateTime对象?可能是问题所在。
因为String和Datetime对象都接受between?
方法,它们都从可比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?
方法。我仍然无法确定这一点,我只是在猜测(也许我什至不知道它甚至取决于实现和表引擎)。