我有一个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格林威治标准时间: 星期四, 16 八月 2012 01:15:30 GMT您的时区:2012 年 8 月 16 日星期四 11:15:30 GMT+10
我的数据库是 - Oracle 数据库 11g 企业版版本 11.2.0.2.0 - 64 位
找到了我问题的答案。
显然,在计算纪元值时,您还需要考虑时区设置
- 将 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');