【问题标题】:Rails/Rails3 SQL query, "LIKE" doesn't work with datetimes properly?Rails/Rails3 SQL 查询,“LIKE”不能正确处理日期时间?
【发布时间】:2011-02-11 15:13:55
【问题描述】:

rails SQL 查询实际上与日期时间兼容吗?

例如,如果我这样做:

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

我希望(并且确实)得到一个包含“.com”电子邮件地址的所有用户的列表。

但是,如果我这样做:

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

我什么也没得到,尽管我可以看到今年创建了一些用户。事实上,有时我会得到胡言乱语(例如,我可能会得到 %20% 的东西(看似没有共同点),但即使我知道其中有 30 的日期,也没有得到 %30% 的回报),这让我觉得“LIKE”适用于我看不到/不关心的东西(可能是某种 ID?)

LIKES 是否仅适用于字符串?有什么方法可以在 Rails 中为日期时间做类似的事情(我确信在 mysql 中有一些方法可以做到这一点,但 rails 也可以处理它吗?)

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

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

【问题讨论】:

    标签: sql ruby-on-rails ruby ruby-on-rails-3 activerecord


    【解决方案1】:
    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')
    

    恕我直言,这是处理日期时间的更好方法

    【讨论】:

      【解决方案2】:

      IIRC,日期时间值存储为整数。 LIKE 运算符适用于字符串。

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

      类似:

       CONVERT(created_at, VARCHAR(20))
      

      【讨论】:

      • 忘了添加,为了比较日期时间,最好使用 BETWEEN 运算符。使用 %2011% 调用 CONVERT,可能可能导致误报,例如 11 月 20 日。
      猜你喜欢
      • 2016-11-17
      • 2016-03-29
      • 1970-01-01
      • 2016-03-05
      • 1970-01-01
      • 1970-01-01
      • 2016-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多