Sql 将日期/时间从UTC转换为会话时区
我的程序接收UTC时间戳,例如2016年5月31日星期二11:43:47 UTC。如何将它们转换为会话当前时区中的时间戳?使用函数获取的时区偏移量,然后使用函数将字符串转换为具有时区的时间戳,并使用将其更改为使用会话的时区Sql 将日期/时间从UTC转换为会话时区,sql,oracle,Sql,Oracle,我的程序接收UTC时间戳,例如2016年5月31日星期二11:43:47 UTC。如何将它们转换为会话当前时区中的时间戳?使用函数获取的时区偏移量,然后使用函数将字符串转换为具有时区的时间戳,并使用将其更改为使用会话的时区 select from_tz(to_timestamp('Tue, 31 May 2016 11:43:47 UTC' ,'Dy, dd Mon yyyy hh24:mi:ss "UTC"')
select from_tz(to_timestamp('Tue, 31 May 2016 11:43:47 UTC'
,'Dy, dd Mon yyyy hh24:mi:ss "UTC"')
, 'UTC')
at time zone tz_offset(sessiontimezone)
,sessiontimezone
from dual;
31/05/2016 19:43:47.000000000 +08:00 Australia/Perth
首先将字符串转换为带有时区的时间戳(使用正确的函数)。要在本地(会话)时区显示结果,请使用“AT local”子句 结果(使用我的前端设置显示带有时区的时间戳-您的可能不同):
为什么这么复杂?此外,在格式模型中硬编码“UTC”是一种糟糕的做法(考虑到您的声誉,我很惊讶)-如果输入来自另一个时区,这将如何工作?反对票是因为这种糟糕的编码实践,而不是复杂的解决方案。你应该使用适当的函数,比如带有时区的时间戳。等等,你自己问了并回答了这个问题吗?真的吗?@mathguy,通过问/回答你自己的问题来记录你在网上发现的东西是一种常见的做法。它让其他人有机会给出其他选项和/或批评(正如你所做的):)硬编码日期/时间格式的字符串对于忽略传入字符串的一部分很有用,当你确信它将始终存在时(如我所做)。文档是(或应该是)对原始帖子的补充,而不是答案。所有这些好处都是一样的。谢谢,我喜欢这个简单得多的解决方案。
select to_timestamp_tz('Tue, 31 May 2016 19:43:47 UTC',
'Dy, dd Mon yyyy hh24:mi:ss tzr') at local from dual;
31-MAY-16 02.43.47.000000000 PM AMERICA/CHICAGO