postgresql:无时区时间戳的时区敏感查询
我有一个表timestamp without time zone
列(输入的数据假定为Australia/Sydney
时区)。postgresql:无时区时间戳的时区敏感查询
查询America/New_York
时区的时间范围(即上午8点至下午4点)的数据。
有没有简单的方法来实现这一目标?
谢谢,p。
想通了。
你需要先转换的时间是with time zone
版本即my_ts at time zone 'Australia/Sydney'
,然后将其转换成它的纽约对口通过at time zone 'America/New_York'
select
my_ts as "Default(syd)",
my_ts at time zone 'Australia/Sydney' as "SYD",
my_ts at time zone 'Australia/Sydney' at time zone 'America/New_York' as "NY",
date_part('hour', my_ts at time zone 'Australia/Sydney' at time zone 'America/New_York') as "NY-hr"
from my_table
where date_part('hour', my_ts at time zone 'Australia/Sydney' at time zone 'America/New_York')>=8
and date_part('hour', my_ts at time zone 'Australia/Sydney' at time zone 'America/New_York')<16
如果我现在添加3小时(),这将是我在纽约的时间,然后做你是如何做到的:'select now():: time,((now():: time +'3:00' ::时区'America/Vancouver'时区'America/New_York'):: time;'我的默认区域是America/Vancouver。这给了我相隔6个小时的时间。它的差距翻倍了,并没有使它们相等。 – 2011-03-15 05:25:28
也许'现在()'已经返回一个TS已经?我不知道,但我的查询为我工作100%,我已经彻底测试过,而你的问题不适用于我的问题。 – pstanton 2011-03-15 05:40:05
您可以将所有的都在相同的时区,所以你可以将其与比较(如果该时区设置):
select current_time, current_time at time zone 'gmt';
timetz | timezone
-------------------+-------------------
20:50:51.07742-07 | 03:50:51.07742+00
如果未设置时区,你需要纠正一些地方时间:
select now()::time, now()::time + '+8:00'::interval;
now | ?column?
-----------------+-----------------
20:57:49.420742 | 04:57:49.420742
一旦你的时候,你所希望的方式,只需一小时的提取物,你可以使用一个简单的条件来选择适当的时间。
select *
from
(select extract(hour from now()::time + '+8:00'::interval) as hour) as t
where hour between 8 and 16;
但我如何查询时间范围,即08:00 - 16:00时间范围是在不同的时区? – pstanton 2011-03-15 04:50:16
谢谢,但你没有回答我的问题......也许我没有正确解释 - 我正在处理悉尼tz/locale系统上的真实日期。 – pstanton 2011-03-15 05:12:25
也许我是这么解释的,但答案在第一行。如果您将专栏更改为带有时区的专栏并将其存储(因为您已经知道某种方式来自纽约),请将相关内容更改为适当的时区。一旦你这样做,你的问题就会消失,因为PG会做正确的事情,所有的转换消失。 current_time和now(),并且与日期一样真实,它们只是用作示例。 – 2011-03-15 05:40:20
我想你的意思时没有时间戳。时区作为一种数据类型只存在于时间上。 (你可以有一个间隔列,你可以添加到时间比较它们在一起虽然) – 2011-03-15 05:06:40
固定谢谢... – pstanton 2011-03-15 05:19:52