选择时间范围包含当前时间的行

时间:2013-07-02 19:06:10

标签: sql postgresql date-range

我有一个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 个答案:

答案 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

你可以SQLFiddle here

答案 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);

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

->SQLfiddle

“当前时间+4:30.000”

如果您想要现在的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代表伊朗