0

我有一个 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 GMT:Thu, 16 Aug 2012 01:15:30 GMT 您的时区:Thu Aug 16 2012 11:15:30 GMT+10

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

4

1 回答 1

0

找到了我的问题的答案。

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

  1. 将 10 小时(10*60*60*1000 毫秒)添加到纪元值 - 纪元当前值在 GMT 中,所以为了使其成为 EST(GMT+10),我添加了这个。
  2. 使用 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');
    
于 2012-08-20T02:24:40.190 回答