0

我有一个具有以下架构的 Postgres 表:

id | name   | sdate (timestamp)   | edate (timestamp)
---+--------+---------------------+---------------------
1  | test6  | 2013-05-13 01:16:16 | 2013-07-03 10:16:11
2  | test44 | 2012-05-10 10:16:11 | 2013-05-03 00:12:11
3  | test32 | 2013-02-03 00:16:12 | 2013-05-03 00:56:15
4  | test2  | 2013-01-05 08:16:11 | 2014-04-03 10:26:11
6  | test3  | 2013-01-03 00:16:12 | 2013-01-03 04:16:18

我需要返回行

select XXX() is in between  sdate and edate

XXX()在哪里current utc time + 4:30.000
在伪代码中:

select count(*)
where ((current utc time  + 4:30.000) >= sdate
    && (current utc time  + 4:30.000) <= edate)

对于初学者,如何在 Postgres 中获得当前的 UTC 时间 + 4:30.000?

4

4 回答 4

3
select *
from some_table 
where current_timestamp at time zone 'UTC' + interval '4:30' minute BETWEEN sdate and edate;
于 2013-07-02T19:32:15.023 回答
1

您可以像这样在 postgres 中获取当前 UTC 时间 + 4:30.000

 now() at time zone 'UTC' + interval '4:30.000'
 -- or current_timestamp at time zone 'UTC' + interval '4:30.000'

你的查询就像

SELECT *
FROM aTable
WHERE now() at time zone 'UTC' + interval '4:30.000' >= sdate
AND now() at time zone 'UTC' + interval '4:30.000' <= edate

你可以在这里出一个 SQLFiddle

于 2013-07-02T19:47:44.810 回答
0

从当前的 Postgres 版本9.2开始,您可以使用新的范围类型:tsrangetstzrange

CREATE TABLE tbl (
   tbl_id int PRIMARY KEY
  ,t_range tstzrange  -- why tstzrange? see below ..
);

然后你可以简单地:

SELECT * FROM tbl
WHERE (now() + interval '00:04:30') <@ t_range

或者(见下文):

...
WHERE (now() AT TIME ZONE 'UTC' + interval '00:04:30') <@ t_range

<@..“元素包含在”运算符中。

为了加快速度,添加一个 GiST 索引:

CREATE INDEX tbl_t_range_idx ON t_range USING gist (t_range);

无论哪种方式,您都需要定义上下边界是包含还是排除

->SQLfiddle

“当前 UTC 时间 + 4:30.000”

如果您现在想要 UTC 时间的文字值,在您当地的时区传输和重新解释 - 与“现在”不同的时间点:

SELECT now() AT TIME ZONE 'UTC'

如果你真的想要“当前时间”,vulgo“现在”,时区是无关紧要的。只有一个“现在”。随时随地(好莱坞电影可能除外。时区只是表示该值的不同方式。当前的 UTC 时间当前的东部标准时间或任何其他当前本地时间相同。这也是 Postgres 内部运作的方式。

如果您想要“现在”,只需获取本地时间戳即可。

如果您想(或必须)使用不同的时区,您应该使用timestamptz而不是timestamp开始。

有关 Postgres 如何在此相关答案中处理时区的更多信息:
在 Rails 和 PostgreSQL 中完全忽略时区

于 2013-07-02T23:13:01.363 回答
0

只需使用正确的时区:

where current_timestamp at time zone 'AFT' BETWEEN sdate and edate;

AFT为阿富汗和IRDT伊朗

于 2013-07-03T07:05:08.837 回答