2011-03-15 102 views
3

我有一个表timestamp without time zone列(输入的数据假定为Australia/Sydney时区)。postgresql:无时区时间戳的时区敏感查询

查询America/New_York时区的时间范围(即上午8点至下午4点)的数据。

有没有简单的方法来实现这一目标?

谢谢,p。

+0

我想你的意思时没有时间戳。时区作为一种数据类型只存在于时间上。 (你可以有一个间隔列,你可以添加到时间比较它们在一起虽然) – 2011-03-15 05:06:40

+0

固定谢谢... – pstanton 2011-03-15 05:19:52

回答

3

想通了。

你需要先转换的时间是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 
+0

如果我现在添加3小时(),这将是我在纽约的时间,然后做你是如何做到的:'select now():: time,((now():: time +'3:00' ::时区'America/Vancouver'时区'America/New_York'):: time;'我的默认区域是America/Vancouver。这给了我相隔6个小时的时间。它的差距翻倍了,并没有使它们相等。 – 2011-03-15 05:25:28

+0

也许'现在()'已经返回一个TS已经?我不知道,但我的查询为我工作100%,我已经彻底测试过,而你的问题不适用于我的问题。 – pstanton 2011-03-15 05:40:05

0

您可以将所有的都在相同的时区,所以你可以将其与比较(如果该时区设置):

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; 
+0

但我如何查询时间范围,即08:00 - 16:00时间范围是在不同的时区? – pstanton 2011-03-15 04:50:16

+0

谢谢,但你没有回答我的问题......也许我没有正确解释 - 我正在处理悉尼tz/locale系统上的真实日期。 – pstanton 2011-03-15 05:12:25

+0

也许我是这么解释的,但答案在第一行。如果您将专栏更改为带有时区的专栏并将其存储(因为您已经知道某种方式来自纽约),请将相关内容更改为适当的时区。一旦你这样做,你的问题就会消失,因为PG会做正确的事情,所有的转换消失。 current_time和now(),并且与日期一样真实,它们只是用作示例。 – 2011-03-15 05:40:20

相关问题