time with time zone
。但我打算使用它来将多个基于time with time zone
的值与当前系统时间进行比较,而不考虑日期。例如,用户说每天从他们所在时区的08:00开始到12:00结束。因此,在一个表中有一个 time without time zone
列,假设为 SCHEDULES.time
,在另一个表中有一个UNIX 时区名称列,假设为 USERS.tz
。我的系统时区是
'America/Regina'
,不使用夏令时,因此偏移始终为 -06
。假设有一个时间为'12:00:00' 和一个时区为'America/Vancouver',我想选择数据到一个类型为
time with time zone
的列中,但我不想将时间转换为我的时区,因为用户实际上要求在温哥华12:00开始,而不是在里贾纳开始。因此,执行以下操作:
SELECT SCHEDULES.time AT TIME ZONE USERS.tz
FROM SCHEDULES JOIN USERS on USERS.ID=SCHEDULES.USERID;
目前的结果为:
'10:00:00-08'
但是我真的想要:
'12:00:00-08'
除了使用AT TIME ZONE
之外,我找不到任何关于将时区应用于时间的文档。是否有一种方法可以在不进行字符操作或其他技巧的情况下完成此操作?
更新: 可以通过使用字符串连接、类型转换和Postgres时区视图来实现此操作,例如:
select ('12:00:00'::text || utc_offset::text)::timetz
from pg_timezone_names
where name = 'America/Vancouver';
然而,这种方法相当慢。一定有更好的方法,不是吗?更新2:我很抱歉造成混淆。 "SCHEDULES"表没有使用"time with time zone",我正在尝试通过组合"time without time zone"和"text"时区名称的值来选择"time with time zone"。
更新3:感谢所有参与讨论的人(激烈的):) 我已经被说服放弃使用"time with time zone"作为我的输出,改用"timestamp with time zone",因为它的性能好,更易读,并解决了我将要遇到的另一个问题,即跨越新日期的时区。例如,在“America / Vancouver”中,“2011-11-21 23:59”是“America / Regina”中的“2011-11-22”。
更新4:如我在最后一次更新中所说,我选择了@MichaelKrelin-hacker首先提出并由@JonSkeet完成的答案。也就是说,"timestamp with time zone"是更好的解决方案作为我的最终输出。最终我使用了像下面这样的查询:
SELECT timezone(USERS.tz, now()::date + SCHEDULES.time)
FROM SCHEDULES
JOIN USERS ON USERS.ID = SCHEDULES.USERID;
在我将(current_date + SCHEDULES.time) AT TIME ZONE USERS.tz
输入到视图中后,Postgres重新编写了timezone()
的格式。