我必须根据他们的updated_at列找到记录。为此,我将updated_at与今天的日期进行比较。 我厌倦了以下方式,但它不会工作
todays_date = Date.today.strftime("%m/%d/%Y")
obj = MyClass.where(:updated_at.strftime("%m/%d/%Y")=> todays_date )
但它不起作用。我怎么能这样做?
答案 0 :(得分:4)
试试这段代码......
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")
答案 1 :(得分:1)
你可以简单地使用:
obj = MyClass.where("updated_at >= ?",Date.today)
也可以使用:
obj = MyClass.where("updated_at >= ?",Date.today.beginning_of_day)
希望有所帮助:)
答案 2 :(得分:1)
一些额外的解释对于评论来说太长了:
您需要清楚ruby中的时间与数据库中的时间之间的差异。在ruby中,时间或日期是时间/日期对象的实例。您可以像在这里一样将它转换为带有strftime的字符串。
在数据库中,它有效地存储为字符串,但因为列类型设置为datetime,所以可以在SQL中调用一些额外的函数(此函数列表将根据您使用的DBMS而有所不同 - mysql,postgres等)。存储在数据库中的日期时间字符串格式也会因DBMS而异。
如果你将todays_date作为一个实际的日期对象(不是字符串),你可以直接将它传递给.where
,rails会将它转换为适当的fomatted字符串,用于生成的sql查询。
例如,
my_date = Date.today #this is a Date object
obj = MyClass.where(:updated_at => my_date)
此时,rails构建了一个sql查询。查询只是一个要在sql中调用的字符串,因此不是字符串的所有内容都将被&#34;翻译&#34;成字符串形式。如果数据库列是日期时间
例如,在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"
它还揭示了比对比更大/更小的作用:它只是字符串比较!因为日期和时间按照最重要元素优先(年,月,日,小时,分钟,秒)的顺序存储,所以日期比较只是字符串比较。即,比较&#34; 2012-10-15&#34;和&#34; 2014-05-09&#34;就像比较&#34; abcdef&#34;和&#34; abcxyz&#34; (&#34; abcxyz&#34;比&#34;更高&#39; abcdef&#34;因为&#34; x&#34;比#34;更高&#34;比#34; d&#34)。
这也可以比较日期和日期时间:
&#34; 2014-05-09 01:00:00&#34;是&#34;更高&#34;比起#34; 2014-05-09&#34;,因为如果有&#34;领带&#34;在两个字符串之间直到其中一个字符串的末尾,具有更多字符的字符串被视为&#34;更高&#34;。这是有帮助的,因为某一天的任何特定时间都被认为是在该日的日期之后(即高于)。