小编典典

来自带有BETWEEN时间戳记的SQL查询的意外结果

sql

我创建了一个小测试应用程序来跟踪我在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

另外,当我通过herheroku pg:psql麓手动运行SQL命令时,它实际上可以与以下输出一起使用:

id | 文字| 类别| 开始时间 结束时间| 创建       
---- + --------------------------------------------- + ---------- + ---- ----------------- + --------------------- + ---------- -----------
  1 | 正在处理一些awsomenews | 0 | 2013-03-21 15:56:00 | 2013-03-21 18:26:00 | 2013-03-21 16:15:21
  2 | 脸书| 0 | 2013-03-21 20:48:00 | 2013-03-21 22:26:00 | 2013-03-21 16:15:21
(2列)

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

那么为什么这行不通呢?


阅读 261

收藏
2021-04-14

共1个答案

小编典典

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

看起来像您timestamp的表中一样,但是使用进行查询timestamptz。这样,这完全取决于会话的本地时区(如果未另行指定,则默认为服务器的时区)。

将两者都切换为timestamptz,或者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

a BETWEEN x AND y几乎总是错timestamp,由于小数的类型!您的查询将做starttime = '2013-03-21T23:59:59.123+00'什么?

2021-04-14