Rails - 按小时排序

时间:2011-04-30 10:35:20

标签: ruby-on-rails postgresql datetime sqlite heroku

@events = Event.all(:order => "date DESC")

按日期订购我的活动,datetime列。

是否可以按日期订购,但只能按小时订购? (我起诉sqlite3数据库)

谢谢!

2 个答案:

答案 0 :(得分:6)

对于SQLite,

@events = Event.all(:order => "time(date) DESC")

小心使用它,因为它忽略了日期。 (请参阅下面的“片刻之后”。)

CREATE TABLE test (date datetime primary key);
INSERT INTO "test" VALUES('2011-01-01 08:00:00');
INSERT INTO "test" VALUES('2011-01-01 08:13:00');
INSERT INTO "test" VALUES('2011-01-01 09:23:00');
INSERT INTO "test" VALUES('2011-01-02 09:15:00');

只有一个日期是1月2日。

sqlite> select * from test order by time(date) desc;
2011-01-01 09:23:00
2011-01-02 09:15:00
2011-01-01 08:13:00
2011-01-01 08:00:00

片刻之后。 。

我意识到你想要按小时排序,而不是按时间排序。这个有问题的要求采用了不同的表达方式,并且排序不同。

@events = Event.all(:order => "strftime('%H', date) DESC")

sqlite> select date from test order by strftime('%H', date) desc;
2011-01-01 09:23:00
2011-01-02 09:15:00
2011-01-01 08:00:00
2011-01-01 08:13:00

最后两行按小时正确排序,时间不正确。

还是晚些时候。 。

OP在Heroku上部署,它不支持SQLite。要按小时降序排序,OP可能需要类似

的内容
@events = Event.all(:order => "extract (hour from date) DESC")

停止使用一个平台进行开发,并停止使用其他平台进行部署。

答案 1 :(得分:1)

由于Heroku使用PostgreSQL,您可以使用:

@events = Event.all(:order => "date_part(hour, date) DESC")

如果在本地使用SQLite3而PostgreSQL用于部署,则会遇到问题 - 平台之间的SQL不一致。