如何让Oracle EXTRACT(HOUR FROM CURRENT_TIMESTAMP)返回实际小时(当前慢1小时)
解决Oracle提取本地时区小时数的问题
问题根源在于EXTRACT(HOUR FROM CURRENT_TIMESTAMP)提取的是UTC时区的小时数,而非你指定的Europe/Lisbon本地时区小时,这就是为什么结果比实际慢1小时(夏令时期间Lisbon比UTC快1小时)。
以下是两种可靠的解决方法:
方法一:用
AT TIME ZONE转换时区后提取
直接将带时区的时间转换为目标时区的无时区时间,再提取小时,自动适配夏令时偏移:SELECT EXTRACT(HOUR FROM CURRENT_TIMESTAMP AT TIME ZONE 'Europe/Lisbon') AS local_hour FROM dual;方法二:显式转换为TIMESTAMP类型后提取
和方法一逻辑一致,只是显式完成类型转换,结果完全相同:SELECT EXTRACT(HOUR FROM CAST(CURRENT_TIMESTAMP AT TIME ZONE 'Europe/Lisbon' AS TIMESTAMP)) AS local_hour FROM dual;
你可以执行以下SQL验证UTC小时和本地小时的差异:
SELECT EXTRACT(HOUR FROM CURRENT_TIMESTAMP) AS utc_hour, EXTRACT(HOUR FROM CURRENT_TIMESTAMP AT TIME ZONE 'Europe/Lisbon') AS lisbon_hour FROM dual;
至于你之前执行的ALTER SESSION SET TIME_ZONE='Europe/Lisbon';,这个设置会影响CURRENT_DATE、SYSDATE这类返回会话时区日期的函数,但不会改变EXTRACT对TIMESTAMP WITH TIME ZONE类型的提取逻辑——它依然会提取UTC小时,所以需要通过上述时区转换的方式获取本地时间的小时数。
内容的提问来源于stack exchange,提问作者Pedro Sousa
相关产品推荐
相关产品推荐

