2011-02-11 111 views
1

rails SQL查询是否与日期时间实际兼容?Rails/Rails3 SQL查询,“LIKE”不适用于日期时间?

例如,如果我这样做:

User.where("email LIKE ?", "%.com%") 

我期望(做)取回所有用户的列表,以“.COM”的电子邮件地址。

但是,如果我这样做:

User.where("created_at LIKE ?","%2011%") 

我回去没事,即使我可以看到,有网友今年创建的。事实上,有时候我会收到乱码(例如,我可能会把一些东西(看起来没有什么共同点)返回给%20%,但是没有什么能够返回到%30%,即使我知道他们中有30个日期),这让我觉得“LIKE”适用于我没有看到/关心的东西(也许某种形式的ID)

仅仅是LIKES字符串?有什么办法可以在日期时间,轨道上做类似的事情(我敢肯定有一些方法可以在MySQL中完成,但轨道也可以处理它吗?)

具体来说,我想在一个范围,类似于:

scope :by_date, lambda {|date| where("created_at LIKE ?",date)} 

回答

1

IIRC,日期时间值存储为整数。 LIKE运算符处理字符串。

您可以尝试使用CONVERT()或CAST()或甚至CONCAT()。

喜欢的东西:

CONVERT(created_at, VARCHAR(20)) 
+1

忘了补充,用于比较日期时间最好是BETWEEN使用运营商。在调用CONVERT时使用%2011%,可能会导致误报,比如当你有11月20日的时候。 – Swartz 2011-02-11 20:23:49

2
dt = Date.new(2011,1,1) 
User.where(['created_at >= ? AND created_at < ?',dt,dt+1.year]) 

产生

SELECT "users".* FROM "users" WHERE (created_at >= '2011-01-01' AND created_at < '2012-01-01') 

这是一种更好的方式来处理日期时间恕我直言