具有BETWEEN时间戳的SQL查询的意外结果

时间:2013-03-21 15:31:28

标签: sql ruby postgresql heroku timestamp-with-timezone

我已经创建了一个小测试应用来追踪我在Heroku上遇到Postgres时遇到的问题:http://snippi.com/s/xd511rf

正如你在 49 中看到的那样,我想检索今天创建的所有条目。这将是我使用Ruby Gem DataMapper 测试数据的前两项。

当我在笔记本上运行这个应用程序(Ubuntu 12.10,HP,Ruby 1.9.3)时,我得到了这个结果,这是正确的:

[
{
    "id": 1,
    "text": "Working on some awsomenewss",
    "category": 0,
    "starttime": "2013-03-21T15:56:00+01:00",
    "endtime": "2013-03-21T18:26:00+01:00",
    "creation": "2013-03-21T16:15:21+01:00"
},
{
    "id": 2,
    "text": "facebooking",
    "category": 0,
    "starttime": "2013-03-21T20:48:00+01:00",
    "endtime": "2013-03-21T22:26:00+01:00",
    "creation": "2013-03-21T16:15:21+01:00"
}
]

在我的调试控制台中,将记录此SQL查询:

SELECT "id", "text", "category", "starttime", "endtime", "creation" 
  FROM "entries" 
  WHERE "starttime" 
    BETWEEN '2013-03-21T00:00:00+00:00' 
      AND '2013-03-21T23:59:59+00:00' 
  ORDER BY "id"

但是在将应用程序推送到Heroku之后发生了一个非常奇怪的错误。当我现在运行它(http://afternoon-everglades-4239.herokuapp.com/)时,这就是响应:

[]

为什么它是空的?

数据肯定在数据库中,这是由Heroku的Dataclip证明的:https://dataclips.heroku.com/hygziosyxwperyctwfbhjzgbzhbj

此外,当我通过'machine pg:psql'手动运行SQL命令时,它实际上可以使用此输出:

 id |            text             | category |      starttime      |       endtime       |      creation       
----+-----------------------------+----------+---------------------+---------------------+---------------------
  1 | Working on some awsomenewss |        0 | 2013-03-21 15:56:00 | 2013-03-21 18:26:00 | 2013-03-21 16:15:21
  2 | facebooking                 |        0 | 2013-03-21 20:48:00 | 2013-03-21 22:26:00 | 2013-03-21 16:15:21
(2 rows)

日志不包含任何错误或更多信息。 我在两种情况下(生产和本地)都使用了远程Heroku PostgreSQL数据库

那为什么这不起作用?

1 个答案:

答案 0 :(得分:2)

检查列的数据类型时区。您可能会感到困惑timestamp with time zone and timestamp

您的表格中似乎有timestamp,但查询timestamptz。这样,一切都取决于会话的本地时区(如果没有另外指定,则默认为服务器的时区。)

如果时区与您完全无关,请将其切换为timestamptztimestamp。 (如有疑问,请使用timestamptz。)

不是问题的原因,但您的查询应该是:

SELECT id, text, category, starttime, endtime, creation 
FROM   entries 
WHERE  starttime >= timestamp '2013-03-21' -- defaults to 00:00 time
AND    starttime <  timestamp '2013-03-22'
ORDER  BY id
由于小数,

a BETWEEN x AND y对于timestamp类型几乎总是错误!您的查询对starttime = '2013-03-21T23:59:59.123+00'有什么作用?