【问题标题】:How to convert '2016-07-01 01:12:22 PM' to '2016-07-01 13:12:22' hour format?如何将“2016-07-01 01:12:22 PM”转换为“2016-07-01 13:12:22”小时格式?
【发布时间】:2019-07-02 08:45:24
【问题描述】:

谁能帮助我如何在 PL/SQL 中将 2016-07-01 01:12:22 PM 转换为 2016-07-01 13:12:22?我使用了以下但没有运气。

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

我预计:08-FEB-19 18.41.41.000000

我收到以下错误:

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

【问题讨论】:

  • 您的字符串无效。 08-FEB-19 18.41.41.000000 AM 时间是 18.41.41 AM。这怎么可能?
  • 我的错误。它应该遵循 ;08-FEB-19 06.41.41.000000 PM

标签: sql oracle type-conversion timestamp


【解决方案1】:

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

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

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

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

Demo

编辑:

如果您想转换具有 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;

【讨论】:

  • 实际上时间应该是 12 小时格式,即 ;08-FEB-19 06.41.41.000000 PM'。我想要结果 --> '08-FEB-19 18.41.41.000000'
  • 嗯...我给你的​​查询是执行此 AFAIK 的正确方法。没有内部 12 或 24 小时格式,只有时间戳。如果您想查看 24 小时制的时间戳,请使用TO_CHAR
  • 为了独立于当前使用会话NLS_DATE_LANGUAGE,您应该更喜欢TO_TIMESTAMP ('08-FEB-19 18.41.41.000000', 'DD-Mon-RR HH24.MI.SS.FF', 'NLS_DATE_LANGUAGE = American') - 或任何“FEB”语言
  • 使用:TO_TIMESTAMP ('08-FEB-19 06.41.41.000000 PM', 'DD-Mon-RR HH.MI.SS.FF PM') ...顺便说一句,请停止更改您的问题。
  • @GoranKutlaca 也许有混淆,因为自从我回答以来,OP 已经多次改变了它的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-25
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
  • 2018-02-23
  • 1970-01-01
  • 2021-02-17
相关资源
最近更新 更多