0

日付範囲のレコードを取得するためのSQLクエリがあります。私のクエリは、データを分析したときにbyutを見つけましたが、レコードはGMTタイムゾーン値に基づいて取得されているため、結果が正しくないことがわかりました。

データベースのUNIXエポック値から時間を取得します。

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:2012年8月16日木曜日01:15:30 GMTタイムゾーン:2012年8月16日木曜日11:15:30 GMT + 10

私のデータベースは-OracleDatabase11gEnterpriseEditionリリース11.2.0.2.0-64ビット

4

1 に答える 1

0

私の質問に対する答えが見つかりました。

どうやら、エポック値を計算するときにもタイムゾーンの設定を考慮する必要があるようです

  1. エポック値に 10 時間 (10*60*60*1000 ミリ秒) を追加します。エポックの現在の値は GMT であるため、EST (GMT+10) にするために、これを追加しました。
  2. to_date の代わりに TO_TIMESTAMP_TZ を使用

    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 に答える