【问题标题】:Oracle - Date FormatOracle - 日期格式
【发布时间】:2016-01-21 22:17:22
【问题描述】:

在转换 Oracle 日期方面需要您的帮助。

我有一列存储像这样的日期20150731 00:00:34.220。但是,我想显示像 20150731 这样的列,但是当我运行一个简单的 select 语句来测试输出时,我收到以下错误。

select TO_DATE('20150731 00:00:34.550','YYYYMMDD')
from dual

错误

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

【问题讨论】:

  • 大家好 - 列的数据类型是 VARCHAR2。
  • "that stores dates like this ..." 如果它确实存储这样的数据,它不是日期列,但您可能会将日期的默认显示混淆为是它们的存储方式 - 这是不正确的。 Oracle 中的实际日期存储为表示不同时间单位的整数集。该数字数据通过 db 默认值或通过 to_char() 的有意操作转换为人类可读的格式。如果数据存储为 varchar,请明确说明。
  • 那么你只需要 substr(that_column_here, 1, 8) 除非我错过了什么
  • 非常感谢大家的帮助。真的很感激。

标签: oracle


【解决方案1】:

这个查询

select TO_DATE('20150731 00:00:34.550','YYYYMMDD')
from dual

导致错误

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

因为你传递了长度为 22 个字符的字符串,但同时传递了 8 个字符的日期格式,这显然与字符串不对应。您应该将查询编写为

select to_timestamp('20150731 00:00:34.550','yyyymmdd hh24:mi:ss.ff3')
  from dual

至于您的表格,因为您有带有日期的 varchar2 列,所以您必须注意表格内容。查询要求源字符串和日期格式完全匹配。
如果您只想显示没有时间的日期,并且不需要将此字符串处理为日期,则可以只显示

select substr('20150731 00:00:34.550', 1, 8)
  from dual

【讨论】:

    【解决方案2】:

    列的数据类型是什么?如果它是DATE(因为它应该)那么不是它不会以你说的格式存储。它以内部二进制格式存储。您将/应该使用 to_char 函数以您选择的任何格式显示它。如果不使用to_char函数,会以NLS_DATE_FORMAT指定的格式显示,可以在多个位置指定。

    对于您的示例,您传递了 yyyymmd hh:mi:ss.fff' 的字符串格式,但您提供的描述掩码仅为 YYYYMMDD。它不知道如何处理时间组件。除了SELECT TO_DATE 时,oracle 还必须执行隐含的TO_CHAR 以将其转换回字符串以用于显示目的。

    此外,您为 to_date 提供了一个包含秒数的字符串。 DATE 数据类型仅解析为秒。如果需要小数秒,则需要使用TIMESTAMP,而不是DATE

    【讨论】:

      【解决方案3】:

      如果您的列是 varchar 并且您需要日期输出:

      select TO_DATE(substr('20150731 00:00:34.550', 1, 8),'YYYYMMDD') from dual
      

      如果是日期格式并且需要字符串输出:

      select to_char(your_column, 'YYYYMMDD') from your_table
      

      【讨论】:

        【解决方案4】:

        是否存储在 Oracle 日期时间列中?如果没有,您可能需要进行一些操作才能将其转换为 DD-MON-YYYY 格式。如果它被存储为文本字符串,您可以使用 SUBSTR( Date_field, Start_Position, Length) 来获取前 8 个字符。看看这个链接SUBSTR

        【讨论】:

          【解决方案5】:

          假设您没有尝试更改列中的值,而只是尝试以YYYYMMDD 格式显示它 -

          正如 a_horse_with_no_name 所述,您只需将其转换为字符串。在此示例中,我使用 systimestamp 作为日期:

          SELECT TO_CHAR(systimestamp,'YYYYMMDD') FROM DUAL
          

          结果:

          20160121
          

          这应该会给你想要显示的YYYYMMDD 格式。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-01-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多