我需要您协助转换Oracle日期。
我有一个列存储日期,如20150731 00:00:34.220
。但是,我想显示像20150731
这样的列,但是当我运行一个简单的select语句来测试输出时,我得到以下错误。
select TO_DATE('20150731 00:00:34.550','YYYYMMDD')
from dual
错误
ORA-01830:日期格式图片在转换整个输入字符串之前结束
答案 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
格式。