我想通过使用to_date将文本'1970-01-01 00:00:01.0'转换为日期,但是我没有得到应该使用的格式。
如果您查看一些示例,例如: to_date('1970-01-01 00:00:01','yyyy-mm-dd HH24:MI:SS') 效果很好,但就我而言,我找不到这种格式。
您能帮我使用哪种日期格式吗?
答案 0 :(得分:2)
您需要转换为日期还是时间戳?
如果需要转换为日期,而忽略小数秒,则可以在日期格式模型中使用样板格式元素。
to_date('1970-01-01 00:00:01.0','yyyy-mm-dd HH24:MI:SS".0"')
注意我添加的内容:双引号中的字符串,即.0
。这将屏蔽任何十进制数字,而不仅仅是0(但必须是一个数字)。
如果某些输入的小数位数可能更多,则可以扩展样板文字,例如扩展为“ .000000000”。如果格式模型中的“零太多”(与输入相比),则可以;但是如果数量太少,那就不会。
答案 1 :(得分:2)
您不能直接在字符串中使用to_date()
,因为.0
部分代表毫秒-Oracle的日期数据类型不具有毫秒精度:
select to_date('1970-01-01 00:00:01.0','YYYY-MM-DD HH24:MI:SS') from dual;
ORA-01830: date format picture ends before converting entire input string
select to_date('1970-01-01 00:00:01.0','YYYY-MM-DD HH24:MI:SS.FF') from dual;
ORA-01821: date format not recognized
该错误是因为模型的FF
部分不适用于日期。
您可以转换为时间戳记:
select to_timestamp('1970-01-01 00:00:01.0','YYYY-MM-DD HH24:MI:SS.FF') from dual;
TO_TIMESTAMP('1970-01-0
-----------------------
1970-01-01 00:00:01.000
,然后如果您确实只希望将其作为日期,则将其强制转换为日期:
select cast(to_timestamp('1970-01-01 00:00:01.0','YYYY-MM-DD HH24:MI:SS.FF') as date) from dual;
CAST(TO_TIMESTAMP('
-------------------
1970-01-01 00:00:01
或者您可以在使用to_date()
之前使用字符串操作删除小数秒部分,或者如果总是变成,则可以将其视为格式模型的常量部分(如@mathguy已显示)。 .0
-没有变化-
还要注意,您拥有的值可以被视为时间戳文字,但前提是整件事都是固定值:
select timestamp '1970-01-01 00:00:01.0' from dual;
TIMESTAMP'1970-01-0100:
-----------------------
1970-01-01 00:00:01.000
如果需要,您可以再次将其转换为日期。