oracle Sql中有多个时间戳列,现在希望将12小时格式时间转换为24小时格式时间,如01-2月18日01.00.21.645000000 PM应该是05-01-0018 13:12:44。但我需要转换为24小时的时间格式,我使用以下声明。
SELECT TO_CHAR(TO_DATE(PERFORMED_TIMESTAMP,'DD-MON-YYYY hh:mi:ss AM'),'DD-MM-YYYY hh24:mi:ss')
FROM FACT_WORK_ITEM_ACTION
WHERE TRUNC(PERFORMED_TIMESTAMP)>= '05-JUN-18'
但我还是得到了下面的错误。
错误代码..。
上午/上午或下午/下午需要01855。00000 -“要求上午/上午/上午或下午/下午”*原因:*行动:
发布于 2018-06-11 10:30:47
选择to_char(‘01~2月18日01.21.01.645',’dd hh12.mi.ss.ff'),‘dd-mm 24:mi:ss’);
发布于 2018-06-11 09:57:03
您的PERFORMED_TIMESTAMP
已经是一个时间戳,它没有任何内在的人类可读的格式-- Oracle在存储值时使用自己的内部表示。
您只是看到客户端显示的时间戳带有来自会话NLS设置的格式(或者,可能被客户端本身重写)。
此错误是因为您正在进行不必要的数据类型转换,并依赖于隐式转换和NLS会话设置。当你做的时候
TO_DATE(PERFORMED_TIMESTAMP,'DD-MON-YYYY hh:mi:ss AM')
您首先将PERFORMED_TIMESTAMP
隐式转换为字符串,再次使用会话NLS设置,因此有效地:
TO_DATE(TO_CHAR(PERFORMED_TIMESTAMP),'DD-MON-YYYY hh:mi:ss AM')
实际上,给出问题中的字符串值是:
TO_DATE(TO_CHAR(PERFORMED_TIMESTAMP, 'DD-MON-RR HH.MI.SS.FF AM'),'DD-MON-YYYY hh:mi:ss AM')
它的内部部分将给出一个类似于“01-Feb-1801.00.21.645000000 PM”的字符串,这就是当您查询表和客户机进行自己的格式化时所看到的。将该字符串传递回to_date()
会导致您所看到的错误,因为小数秒出现在字符串中,它希望在该字符串中看到AM/PM标记:
SELECT TO_DATE('01-FEB-18 01.00.21.645000000 PM','DD-MON-YYYY hh:mi:ss AM')
FROM DUAL;
Error report -
ORA-01855: AM/A.M. or PM/P.M. required
您可以用显式转换和格式掩码替换隐式转换和会话值:
TO_CHAR(TO_DATE(TO_CHAR(PERFORMED_TIMESTAMP, 'DD-MON-YYYY hh:mi:ss AM'),'DD-MON-YYYY hh:mi:ss AM'), 'DD-MM-YYYY hh24:mi:ss')
但是,希望您能够看出,-and所做的工作比它所需要的要多得多,必须使用相同的格式掩码两次,这也表明您正在做一些错误的事情。
真正的解决办法就是简化它。您根本不需要转换为字符串和返回日期。只要做:
SELECT TO_CHAR(PERFORMED_TIMESTAMP, 'DD-MM-YYYY HH24:MI:SS')
FROM FACT_WORK_ITEM_ACTION
WHERE PERFORMED_TIMESTAMP >= TIMESTAMP '2018-06-05 00:00:00';
请注意,我还删除了trunc()
和字符串的比较;现在将时间戳列作为时间戳进行比较,这也会使任何索引都更快乐。
提供虚拟数据的CTE快速演示:
with FACT_WORK_ITEM_ACTION(PERFORMED_TIMESTAMP) as (
select timestamp '2018-06-01 13:00:21.645000000' from dual
union all select timestamp '2018-06-06 13:00:21.645000000' from dual
)
SELECT TO_CHAR(PERFORMED_TIMESTAMP, 'DD-MM-YYYY HH24:MI:SS')
FROM FACT_WORK_ITEM_ACTION
WHERE PERFORMED_TIMESTAMP >= TIMESTAMP '2018-06-05 00:00:00';
TO_CHAR(PERFORMED_T
-------------------
06-06-2018 13:00:21
https://stackoverflow.com/questions/50794069
复制相似问题