时间戳之间的SQL查询的意外结果

时间戳之间的SQL查询的意外结果,sql,ruby,postgresql,heroku,timestamp-with-timezone,Sql,Ruby,Postgresql,Heroku,Timestamp With Timezone,我创建了一个小测试应用程序来追踪我在Heroku上遇到的一个问题: 如第49行所示,我希望检索今天创建的所有条目。这将是我使用Ruby Gem DataMapper测试数据的前两项 当我在笔记本电脑Ubuntu12.10、HP、Ruby 1.9.3上运行此应用程序时,我得到的结果是正确的: [ { "id": 1, "text": "Working on some awsomenewss", "category": 0, "starttime": "2013-03

我创建了一个小测试应用程序来追踪我在Heroku上遇到的一个问题:

如第49行所示,我希望检索今天创建的所有条目。这将是我使用Ruby Gem DataMapper测试数据的前两项

当我在笔记本电脑Ubuntu12.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后,出现了一个非常奇怪的错误。当我现在运行它时,这是响应:

[]
为什么是空的

数据肯定在数据库中,Heroku的数据剪辑证明了这一点:

另外,当我通过“heroku 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数据库

那么为什么这不起作用呢?

检查列的数据类型和时区。你可能会感到困惑

看起来您的表中有时间戳,但查询时使用了timestamp。这样,它完全取决于会话的本地时区,如果没有另外指定,则默认为服务器的时区

切换到timestamp,如果时区与您完全无关,则切换到timestamp。如果有疑问,请使用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
对于时间戳类型,x和y之间的a几乎总是错误的,这是由于小数!您的查询对starttime='2013-03-21T23:59:59.123+00'有何作用?

检查列的数据类型和时区。你可能会感到困惑

看起来您的表中有时间戳,但查询时使用了timestamp。这样,它完全取决于会话的本地时区,如果没有另外指定,则默认为服务器的时区

切换到timestamp,如果时区与您完全无关,则切换到timestamp。如果有疑问,请使用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

对于时间戳类型,x和y之间的a几乎总是错误的,这是由于小数!对于starttime='2013-03-21T23:59:59.123+00',您的查询会做什么?

对于这个问题,带有精确类型声明的表创建脚本是必不可少的。对于这个问题,带有精确类型声明的表创建脚本是必不可少的。如果查看,您会发现时间戳值中没有时区,所以我猜是这样的列是timestamp而不是timestamp。这也与通常的时间戳一致,在源于Rails的数据库方法中,所有内容都是UTC的,也就是说,另一个隐藏的污点,因为Rails的人不理解关系数据库。我更强烈地说,无论类型如何,几乎总是错误的。我在野外看到的BETWEEN 90%的使用都希望成为您明确编写的包含性开始-独占性结束间隔测试。非常感谢您给出了这个出色的答案。今晚我会尝试一些东西,如果一切正常,我会回答。如果你看一下,你会发现时间戳值中没有时区,所以我猜这些列是时间戳,而不是时间戳。这也与通常的时间戳一致,在源于Rails的数据库方法中,所有内容都是UTC的,也就是说,另一个隐藏的污点,因为Rails的人不理解关系数据库。我更强烈地说,无论类型如何,几乎总是错误的。我在野外看到的BETWEEN 90%的使用都希望成为您明确编写的包含性开始-独占性结束间隔测试。非常感谢您给出了这个出色的答案。今晚我会尝试一些东西,如果一切都好,我会回答。