如何使用to_date作为日期,例如“ 1970-01-01 00:00:01.0”

时间:2019-05-27 14:20:33

标签: sql oracle

我想通过使用to_date将文本'1970-01-01 00:00:01.0'转换为日期,但是我没有得到应该使用的格式。

如果您查看一些示例,例如: to_date('1970-01-01 00:00:01','yyyy-mm-dd HH24:MI:SS') 效果很好,但就我而言,我找不到这种格式。

您能帮我使用哪种日期格式吗?

2 个答案:

答案 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()之前使用字符串操作删除小数秒部分,或者如果总是变成.0-没有变化-,则可以将其视为格式模型的常量部分(如@mathguy已显示)。

还要注意,您拥有的值可以被视为时间戳文字,但前提是整件事都是固定值:

select timestamp '1970-01-01 00:00:01.0' from dual;

TIMESTAMP'1970-01-0100:
-----------------------
1970-01-01 00:00:01.000

如果需要,您可以再次将其转换为日期。