我有一个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?
答案 0 :(得分:3)
select *
from some_table
where current_timestamp at time zone 'UTC' + interval '4:30' minute BETWEEN sdate and edate;
答案 1 :(得分: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
答案 2 :(得分:0)
从当前的Postgres版本 9.2 开始,您可以使用新的范围类型:tsrange
or tstzrange
:
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
<@
.. "element is contained by" operator.
要快速完成此操作,请添加GiST索引:
CREATE INDEX tbl_t_range_idx ON t_range USING gist (t_range);
无论哪种方式,您需要来定义上边框和下边框是包含还是排除。
如果您想要现在的UTC时间的字面值,在当地时区转移和重新解释 - 与“现在”不同的时间点:
SELECT now() AT TIME ZONE 'UTC'
如果你真的想要“当前时间”,即“现在”,那么时区就无关紧要了。 只有 一个 “now”。随时随地(好莱坞电影可能除外。时区只是代表该值的不同方式。当前UTC时间与当前东部标准时间相同或任何其他当前的当地时间。这也是Postgres内部运作的方式。
如果您想要“现在”,请使用本地时间戳。
如果您想(或必须)使用不同的时区,您应该先使用timestamptz
代替timestamp
。
有关Postgres如何处理此相关答案中的时区的更多信息:
Ignoring timezones altogether in Rails and PostgreSQL
答案 3 :(得分:0)
只需使用正确的时区:
where current_timestamp at time zone 'AFT' BETWEEN sdate and edate;
AFT
代表阿富汗,IRDT
代表伊朗