首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将ORACLE SQL中的12小时格式小时转换为24小时格式时间,如01-2月18日01.00.21.645000000 PM应为05-01-0018 13:12:44

如何将ORACLE SQL中的12小时格式小时转换为24小时格式时间,如01-2月18日01.00.21.645000000 PM应为05-01-0018 13:12:44
EN

Stack Overflow用户
提问于 2018-06-11 09:08:53
回答 2查看 10.1K关注 0票数 0

oracle Sql中有多个时间戳列,现在希望将12小时格式时间转换为24小时格式时间,如01-2月18日01.00.21.645000000 PM应该是05-01-0018 13:12:44。但我需要转换为24小时的时间格式,我使用以下声明。

代码语言:javascript
运行
复制
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 -“要求上午/上午/上午或下午/下午”*原因:*行动:

EN

回答 2

Stack Overflow用户

发布于 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’);

票数 1
EN

Stack Overflow用户

发布于 2018-06-11 09:57:03

您的PERFORMED_TIMESTAMP已经是一个时间戳,它没有任何内在的人类可读的格式-- Oracle在存储值时使用自己的内部表示。

您只是看到客户端显示的时间戳带有来自会话NLS设置的格式(或者,可能被客户端本身重写)。

此错误是因为您正在进行不必要的数据类型转换,并依赖于隐式转换和NLS会话设置。当你做的时候

代码语言:javascript
运行
复制
TO_DATE(PERFORMED_TIMESTAMP,'DD-MON-YYYY hh:mi:ss AM')

您首先将PERFORMED_TIMESTAMP隐式转换为字符串,再次使用会话NLS设置,因此有效地:

代码语言:javascript
运行
复制
TO_DATE(TO_CHAR(PERFORMED_TIMESTAMP),'DD-MON-YYYY hh:mi:ss AM')

实际上,给出问题中的字符串值是:

代码语言:javascript
运行
复制
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标记:

代码语言:javascript
运行
复制
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

您可以用显式转换和格式掩码替换隐式转换和会话值:

代码语言:javascript
运行
复制
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所做的工作比它所需要的要多得多,必须使用相同的格式掩码两次,这也表明您正在做一些错误的事情。

真正的解决办法就是简化它。您根本不需要转换为字符串和返回日期。只要做:

代码语言:javascript
运行
复制
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快速演示:

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50794069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档