带有时间戳和ISO日期的Oracle SQL查询语句和条件

时间:2015-01-29 08:43:58

标签: sql oracle datetime oracle11g isodate

我需要一个查询,它将根据日期时间条件从Oracle数据库中选择记录。示例如下:

SELECT * FROM table_name WHERE [modification_date] >= '2014-01-28T12:00:00Z';

作为日期时间我使用ISO日期,这是“必须”。在Oracle XE数据库中,[modification_date]列的类型为“带时区的时间戳”。 现在是我的问题 - 如何将查询中的ISO日期转换为正确的数据库搜索?

我尝试将to_timestamp_tz添加到查询语句中。

SELECT * FROM table_name
WHERE MODIFICATION_DATE >= to_timestamp_tz('2014-01-28T00:00:0Z', 'YYYY-MM-DD"T"HH24:MI:SS');

但是得到这个错误:

  

SQL错误[1830] [22008]:ORA-01830:日期格式图片之前结束   转换整个输入字符串

2 个答案:

答案 0 :(得分:2)

基于an earlier question,很有可能将T和Z都视为字符文字,并且基本上忽略它们,使用:

to_timestamp_tz('2014-01-28T12:00:0Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z"')

如果您在未指定时区的情况下使用to_timestamp_tz(),则默认为会话时区,to_timestamp()也是如此;所以在Zulu / UTC中指定的时间会丢失该区域信息:

alter session set time_zone = 'America/New_York';
select to_timestamp_tz('2014-01-28T12:00:0Z',
  'YYYY-MM-DD"T"HH24:MI:SS"Z"') from dual;

TO_TIMESTAMP_TZ('2014-01-28T12:00:0Z','YYYY-MM-DD"T"HH24:MI:SS"Z"')
-------------------------------------------------------------------
28-JAN-14 12.00.00.000000000 AMERICA/NEW_YORK                       

您的12:00时间在纽约显示为12:00,而不是UTC UTC时间。

假设您的值始终应代表UTC,更安全的转换是使用the from_tz() function明确指定时区:

WHERE MODIFICATION_DATE >= from_tz(to_timestamp('2014-01-28T12:00:0Z',
  'YYYY-MM-DD"T"HH24:MI:SS"Z"'), 'UTC')

这正确地获得了UTC时间:

alter session set time_zone = 'America/New_York';
select from_tz(to_timestamp('2014-01-28T12:00:0Z',
  'YYYY-MM-DD"T"HH24:MI:SS"Z"'), 'UTC') from dual;

FROM_TZ(TO_TIMESTAMP('2014-01-28T12:00:0Z','YYYY-MM-DD"T"HH24:MI:SS"Z"'),'UTC')
-------------------------------------------------------------------------------
28-JAN-14 12.00.00.000000000 UTC                                                

答案 1 :(得分:0)

查看to_timestamp_tz函数。

假设Z代表Zulu / UTC,你可能会用+00:00替换Z并使用to_timestamp_tz函数

SELECT * FROM table_name 
WHERE modification_date >= to_timestamp_tz(replace('2014-01-28T12:00:00z','z','+00:00'),'YYYY-MM-DD"T"hh24:mi:sstzh:tzm')