Oracle SQL 带有时间戳和 ISO 日期的查询语句和条件
Oracle SQL query statement and conditions with timestamps and ISO dates
我需要一个查询,它会根据日期时间条件从 Oracle 数据库中 select 记录。示例如下:
SELECT * FROM table_name WHERE [modification_date] >= '2014-01-28T12:00:00Z';
我使用 ISO 日期作为日期时间,这是 "Must be"。在 Oracle XE 数据库中,[modification_date] 列的类型为 "Timestamp with time zone"。
现在是我的问题 - 如何将查询中的 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 Error [1830] [22008]: ORA-01830: date format picture ends before
converting entire input string
查看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')
基于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,而不是 12:00 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
我需要一个查询,它会根据日期时间条件从 Oracle 数据库中 select 记录。示例如下:
SELECT * FROM table_name WHERE [modification_date] >= '2014-01-28T12:00:00Z';
我使用 ISO 日期作为日期时间,这是 "Must be"。在 Oracle XE 数据库中,[modification_date] 列的类型为 "Timestamp with time zone"。 现在是我的问题 - 如何将查询中的 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 Error [1830] [22008]: ORA-01830: date format picture ends before converting entire input string
查看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')
基于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,而不是 12:00 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