如何将'2016-07-01 01:12:22 PM'转换为'2016-07-01 13:12:22'小时格式?

use*_*047 0 sql oracle timestamp type-conversion

任何人都可以帮我如何转换2016-07-01 01:12:22 PM2016-07-01 13:12:22PL/SQL?我使用了以下但没有运气.

SELECT TO_TIMESTAMP ('08-FEB-19 06.41.41.000000 PM', 'DD-Mon-RR HH24:MI:SS.FF') 
FROM dual
Run Code Online (Sandbox Code Playgroud)

我期待:08-FEB-19 18.41.41.000000

我收到以下错误:

ORA-01830:日期格式图片在转换整个输入字符串之前结束

Tim*_*sen 5

您当前的时间戳没有意义,因为它将时间指定为18小时,即下午6点,但它还指定了AM子午线指示符,这意味着早于中午.因此,您可以AMTO_TIMESTAMP模式中删除:

SELECT TO_TIMESTAMP ('08-FEB-19 18.41.41.000000', 'DD-Mon-RR HH24.MI.SS.FF')
FROM dual;

08-FEB-19 06.41.41.000000000 PM
Run Code Online (Sandbox Code Playgroud)

请注意,Oracle内部实际上没有12或24小时格式时间戳.相反,如果您想以24小时格式查看Oracle时间戳,您可以TO_CHAR使用适当的24小时格式掩码进行调用:

SELECT
    TO_CHAR(TO_TIMESTAMP ('08-FEB-19 18.41.41.000000', 'DD-Mon-RR HH24.MI.SS.FF'),
        'DD-Mon-RR HH24.MI.SS.FF') AS ts
FROM dual;

08-Feb-19 18.41.41.000000000
Run Code Online (Sandbox Code Playgroud)

演示

编辑:

如果要将时间戳字符串转换为12小时时间和AM/PM组件,我们可以尝试:

SELECT
    TO_CHAR(
        TO_TIMESTAMP ('08-FEB-19 06.41.41.000000 PM', 'DD-Mon-RR HH.MI.SS.FF PM'),
        'DD-Mon-RR HH24.MI.SS.FF')
FROM dual;
Run Code Online (Sandbox Code Playgroud)