我必须根据其 Updated_at 列找到记录。为此,我将 Updated_at 与今天的日期进行比较。 我厌倦了以下方式,但它不起作用
todays_date = Date.today.strftime("%m/%d/%Y")
obj = MyClass.where(:updated_at.strftime("%m/%d/%Y")=> todays_date )
但是它不起作用。我该怎么做?
试试这个代码...
obj = MyClass.where("updated_at >= ? AND updated_at <= ?",Date.today.to_time.beginning_of_day,Date.today.to_time.end_of_day)
下面的代码将不起作用,因为 :updated_at 是符号而不是对象(语法错误)。
:updated_at.strftime("%m/%d/%Y")
一些额外的解释对于评论来说太长了:
你需要清楚ruby中的时间和数据库中的时间之间的区别。 在 ruby 中,时间或日期是 Time/Date 对象的实例。 您可以像此处一样使用 strftime 将其转换为字符串。
在数据库中,它有效地存储为字符串,但由于列类型设置为日期时间,因此您可以在 SQL 中调用一些额外的函数(此函数列表将根据您使用的 DBMS - mysql 、postgres 等)。 存储在数据库中的日期时间字符串的格式将再次根据 DBMS 的不同而有所不同。
如果您将 Todays_date 作为实际日期对象(而不是字符串),则可以将其直接传递到
.where
,rails 会将其转换为结果 sql 查询的适当格式的字符串。
例如,
my_date = Date.today #this is a Date object
obj = MyClass.where(:updated_at => my_date)
此时,rails 构建了一个 sql 查询。 查询只是在 sql 中调用的字符串,因此所有不是字符串的内容都会被“翻译”为字符串形式。 如果数据库列是日期时间 以 mysql 为例,sql 是
select * from my_classes where updated_at = "2014-05-09";
请注意,即使我们通过了一个日期
当您自己将日期转换为字符串时,您可能会使用不正确的格式。 例如,如果你要这样做
obj = MyClass.where(:updated_at => my_date.strftime("%m/%d/%Y"))
那么 Rails 已经获取了一个字符串作为查询的值,并且它不会尝试翻译它。 你最终会得到这个sql:
select * from my_classes where updated_at = "09/05/2014;
而且,由于您的数据库不以该格式存储日期,因此您不会获得任何匹配项。
您可以通过调用
.to_s(:db)
来查看日期如何转换为数据库格式。 这揭示了日期和时间之间的差异:
Date.today.to_s(:db)
=> "2014-05-09"
Date.today.to_time.to_s(:db)
=> "2014-05-09 00:00:00"
它还揭示了大于/小于比较的工作原理:这只是字符串比较! 由于日期和时间按照最重要元素在前(年、月、日、小时、分钟、秒)的顺序存储,因此日期比较只是字符串比较。 即,比较“2012-10-15”和“2014-05-09”就像比较“abcdef”和“abcxyz”(“abcxyz”比“abcdef”“更高”,因为“x”比“abcdef”“更高”) “d”)。
这还允许比较日期和日期时间:
“2014-05-09 01:00:00”比“2014-05-09”“更高”,因为如果两个字符串之间存在“平局”,直到其中一个字符串的末尾,即具有更多字符的字符串被视为“较高”。 这很有帮助,因为给定日期的任何特定时间都被认为是在当天的日期之后(即高于)。
obj = MyClass.where("updated_at >= ?",Date.today)
还可以使用:
obj = MyClass.where("updated_at >= ?",Date.today.beginning_of_day)
希望有帮助:)