Oracle sql查询需要根据时区变化

Posted

技术标签:

【中文标题】Oracle sql查询需要根据时区变化【英文标题】:Oracle sql query needs to change based on timezone 【发布时间】:2012-08-12 09:00:46 【问题描述】:

我有一个 sql 查询来获取某个日期范围的记录。当我分析数据时,我的查询工作 find byut,我发现记录是基于 GMT 时区值检索的,因此导致结果不正确。

我从数据库中的 unix epoch 值获取时间。

SELECT tableA.columnA,tableB.columnB 
FROM tableA INNER JOIN tableB ON  tableA.aId = tableB.aId 
WHERE (to_date('1970-01-01 00:00:00 +10:00','yyyy-MM-dd hh24:mi:ss') +    (tableB.epochValue/60/60/24/1000)) >  to_date('--FROM_DATE--', 'yyyy-MM-dd hh24:mi:ss') 
AND (to_date('1970-01-01 00:00:00 +10:00','yyyy-MM-dd hh24:mi:ss') + (tableB.epochValue/60/60/24/1000)) <= to_date('--TO_DATE--', 'yyyy-MM-dd hh24:mi:ss');

我想根据我的时区 GMT+10 获取记录,但此脚本根据 GMT 时区获取数据。 我想知道如何通过我的时区来获取正确的日期对象

使用http://www.epochconverter.com/,我得到了这些值 我的时代价值 - 1345079730 格林威治标准时间:格林威治标准时间 2012 年 8 月 16 日星期四 01:15:30 您的时区:2012 年 8 月 16 日星期四 11:15:30 GMT+10

我的数据库是 - Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit

【问题讨论】:

【参考方案1】:

找到了我的问题的答案。

显然,您在计算纪元值时也需要考虑时区设置

    将 10 小时(10*60*60*1000 毫秒)添加到纪元值 - 纪元当前值以 GMT 为单位,所以为了使其成为 EST (GMT+10),我添加了这个。

    使用 TO_TIMESTAMP_TZ 代替 to_date

    SELECT tableA.columnA,tableB.columnB 
    FROM tableA INNER JOIN tableB ON  tableA.aId = tableB.aId 
    WHERE (TO_TIMESTAMP_TZ('1970-01-01 00:00:00 +10:00','yyyy-MM-dd hh24:mi:ss TZH:TZM') +    ((tableB.epochValue+(10*60*60*1000))/60/60/24/1000)) >  to_date('##FROM_DATE## +10:00', 'yyyy-MM-dd hh24:mi:ss TZH:TZM') 
    AND (TO_TIMESTAMP_TZ('1970-01-01 00:00:00 +10:00','yyyy-MM-dd hh24:mi:ss TZH:TZM') + ((tableB.epochValue+(10*60*60*1000))/60/60/24/1000)) <= to_date('##TO_DATE## +10:00', 'yyyy-MM-dd hh24:mi:ss TZH:TZM');
    

【讨论】:

以上是关于Oracle sql查询需要根据时区变化的主要内容,如果未能解决你的问题,请参考以下文章

使用SQL查询监控Oracle性能

SQL - 从复杂查询更新 Oracle 10g 数据库

sql 查询取差集,需要根据两个字段来确定行

Oracle SQL 查询对连续记录进行分组

Oracle PL/SQL查询结果如何自动换行

Oracle PL/SQL查询结果如何自动换行