You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 20:39:27