Oracle - 日期格式

时间:2016-01-21 22:17:23

标签: oracle

我需要您协助转换Oracle日期。

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

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

错误

  

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

5 个答案:

答案 0 :(得分:1)

该列的数据类型是什么?如果它是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

答案 1 :(得分: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 :(得分:0)

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

答案 3 :(得分:0)

如果您的列是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 :(得分:0)

假设您并未尝试更改列中的值,并且只是尝试以YYYYMMDD格式显示它 -

如a_horse_with_no_name所述,您只需将其转换为字符串即可。在这个例子中,我使用systimestamp作为我的日期:

SELECT TO_CHAR(systimestamp,'YYYYMMDD') FROM DUAL

结果:

20160121

这应该为您提供要显示的YYYYMMDD格式。