我需要使用函数将本地时间转换为UTC。我的输入是当地时间,当地时间的时区(例如'太平洋/奥克兰')。我需要从程序中获得的是基于给定时区的当地时间的UTC时间。
有人可以帮忙吗?
我使用的是版本8.3
答案 0 :(得分:21)
manual中介绍了这一点,但如何实际使用日期/时间并不总是很明显。 SQL规范有点奇怪。
如果您的问题不清楚是否要以UTC格式存储时间,而是将其显示在服务器的当地时间(TimeZone
),或者您是否愿意忽略TimeZone
并始终将其显示为UTC。我会假设后者。
对于时间戳,您只需使用AT TIME ZONE
两次,例如:
SELECT TIMESTAMP '2013-08-13 00:00:00' AT TIME ZONE 'Australia/Sydney' AT TIME ZONE 'UTC';
您需要使用AT TIME ZONE
两次。根据参数时区将输入timestamp
转换为timestamptz
,然后将另一个转换为UTC的timestamp
。
不幸的是,由于(IMO疯狂)SQL规范为AT TIME ZONE
定义了TIME
,你不能对TIME
做同样的事情。您必须改为操纵TimeZone
变量:
SET TimeZone = 'UTC';
SELECT TIME '07:00' AT TIME ZONE 'Australia/Sydney';
这仍然会让您timetz
而不是time
。因此,其显示值会随timezone
设置而变化。