1

鉴于我在 postgresql 中有一个带有 created_at 列的签入表,我将如何在考虑时区'America/New_York'(并考虑到夏令时)?

目前我正在执行以下查询,psql (PostgreSQL) 9.1.6但它似乎缺少一些在一天结束时添加的记录。

SELECT COUNT(*) AS count FROM checkins WHERE date(created_at) = '2012-10-17';

这是给定日期的所有记录的列表。上面的查询返回 10,这是不正确的。我应该回到13。

  id  | waiver_id |         created_at         |         updated_at         
------+-----------+----------------------------+----------------------------
 1391 |         1 | 2012-10-18 00:42:07.308453 | 2012-10-18 00:42:07.308453
 1390 |       286 | 2012-10-18 00:38:53.102685 | 2012-10-18 00:38:53.102685
 1389 |       590 | 2012-10-18 00:38:28.811605 | 2012-10-18 00:38:28.811605
 1388 |         7 | 2012-10-17 22:29:25.610774 | 2012-10-17 22:29:25.610774
 1387 |      1155 | 2012-10-17 22:01:40.647219 | 2012-10-17 22:01:40.647219
 1386 |      1154 | 2012-10-17 22:00:05.477698 | 2012-10-17 22:00:05.477698
 1385 |      1153 | 2012-10-17 21:57:59.698076 | 2012-10-17 21:57:59.698076
 1384 |      1152 | 2012-10-17 21:08:32.533203 | 2012-10-17 21:08:32.533203
 1383 |      1151 | 2012-10-17 21:07:42.500036 | 2012-10-17 21:07:42.500036
 1382 |       115 | 2012-10-17 21:04:03.075333 | 2012-10-17 21:04:03.075333
 1381 |         3 | 2012-10-17 20:30:13.741647 | 2012-10-17 20:30:13.741647
 1380 |       245 | 2012-10-17 20:29:53.808852 | 2012-10-17 20:29:53.808852
 1379 |      1150 | 2012-10-17 20:27:30.057269 | 2012-10-17 20:27:30.057269

签入列和数据类型

 column_name |          data_type          
-------------+-----------------------------
 updated_at  | timestamp without time zone
 created_at  | timestamp without time zone
 waiver_id   | integer
 id          | integer
4

1 回答 1

5

根据您的确切需求,该AT TIME ZONE构造可以提供帮助。

如果您的列属于类型timestamp [without time zone],并且您的本地时间设置为与 EST 不同的时区,但您想要 EST 的相应日期,这将是您的查询:

SELECT count(*) AS ct
FROM   checkins
WHERE  (created_at AT TIME ZONE 'EST')::date = '2012-10-16';

不能肯定地说,您的问题缺少基本信息并留有解释空间。
PostgreSQL 时区处理的综合说明,并在此相关答案中提供了示例和链接。

如果您希望自动涵盖夏令时,请使用时区名称而不是时区缩写。喜欢:

created_at AT TIME ZONE 'America/New_York'

有关此相关问题的更多信息。

于 2012-10-18T05:25:35.630 回答