PostgreSQL:基于时区的查询时间戳(无时区)

3

我有一张带有没有时区的时间戳列的表格(假设输入的数据在澳大利亚/悉尼时区)。

美国/纽约时区内查询一个时间范围的数据(即上午8点到下午4点)。

有没有简单的方法来实现这个?

谢谢,p。


我认为你的意思是没有时间戳的时间。时区作为一种数据类型只存在于时间的关系中。(但你可以有一个间隔列,将其添加到时间中以比较它们。) - nate c
2个回答

3

明白了。

首先需要将时间转换为其带有时区的版本,即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':: interval) at time zone 'America/Vancouver' at time zone 'America/New_York')::time; 我的默认时区是美国/温哥华。这给了我相差6个小时的时间。它使差异加倍而不是平衡它们。 - nate c
也许 now() 已经返回带有时区的时间戳了?我不确定,但我的查询对我来说百分之百有效,我已经彻底测试过了,而你的查询并不适用于我的问题。 - pstanton

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;

但是我该如何在时间范围内进行查询,比如08:00-16:00,而时间范围在不同的时区? - pstanton
谢谢,但您没有回答我的问题...也许我没有解释清楚——我正在处理一个位于悉尼时区/语言环境的系统上的实际日期。 - pstanton
也许我没有解释清楚,但答案在第一行。最好将您的列更改为带有时区并存储它(因为您已经知道它来自纽约)。然后将相关内容更改为适当的时区。一旦您这样做,您的问题就会消失,因为PG将只是做正确的事情,所有转换都会消失。current_time和now()与您的日期一样真实,它们只是用作示例。 - nate c

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接