PostgreSQL(Heroku)中的时间/日期时间比较

时间:2012-02-07 10:14:31

标签: mysql ruby-on-rails-3 postgresql datetime heroku

我正在为Heroku(Postgres)构建一个应用程序,但出于各种原因,使用MySQL在本地开发它。关于我的MySQL开发环境所采取的措施,我遇到了一个障碍,但是heroku Postgres环境依然存在。这是来自Heroku的日志流:

2012-02-07T10:00:00+00:00 app[web.1]: Report Load (2.5ms)  SELECT id, datetime_utc FROM "reports" WHERE (datetime_utc = '2012-02-07 10:00:00.000000') AND (datetime_utc > spot_sunrise_utc AND datetime_utc > spot_sunset_utc) ORDER BY datetime_utc ASC LIMIT 500
2012-02-07T10:00:00+00:00 app[web.1]: PGError: ERROR:  operator does not exist: timestamp without time zone > time without time zone
2012-02-07T10:00:00+00:00 app[web.1]: LINE 1: ...EEN 0.4573170731707317 and 200) AND (datetime_utc > spot_sun...
2012-02-07T10:00:00+00:00 app[web.1]:                                                              ^
2012-02-07T10:00:00+00:00 app[web.1]: HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

datetime_utc字段是真实的datetime,而spot_sunrise / sunset_utc字段只是时间值。

造成这种情况的原因是什么,我该如何解决?

1 个答案:

答案 0 :(得分:2)

要减轻类型不兼容性,请将时间戳值datetime_utc转换为时间,如我所示:

SELECT id, datetime_utc
FROM   reports
WHERE  datetime_utc = '2012-02-07 10:00'
AND    datetime_utc::time > spot_sunrise_utc 
AND    datetime_utc::time > spot_sunset_utc
ORDER  BY datetime_utc 
LIMIT  500

BTW:使用WHERE过滤后,其他ORDER BY datetime_utc子句和WHERE datetime_utc = '2012-02-07 10:00'只是噪音。但我认为这只是一个极端的案例。

建议:在SO上已多次说过:在部署时使用相同的DB进行开发通常是一个好主意。因此,在本地使用MySQL是一个糟糕的想法。

最后,数据库的名称是PostgreSQL或Postgres。没有“postgre”这样的东西。