【发布时间】:2019-05-27 14:20:33
【问题描述】:
我想使用 to_date 将文本 '1970-01-01 00:00:01.0' 转换为日期,但我不知道应该使用哪种格式。
如果您查看以下示例: to_date('1970-01-01 00:00:01','yyyy-mm-dd HH24:MI:SS') 效果很好,但就我而言,我找不到这样的格式。
请问我应该使用哪种日期格式?
【问题讨论】:
我想使用 to_date 将文本 '1970-01-01 00:00:01.0' 转换为日期,但我不知道应该使用哪种格式。
如果您查看以下示例: to_date('1970-01-01 00:00:01','yyyy-mm-dd HH24:MI:SS') 效果很好,但就我而言,我找不到这样的格式。
请问我应该使用哪种日期格式?
【问题讨论】:
您不能将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
如果需要,您可以再次将其转换为日期。
【讨论】:
您需要转换为日期还是时间戳?
如果您需要转换为日期,并忽略小数秒,您可以使用日期格式模型中的样板格式元素。
to_date('1970-01-01 00:00:01.0','yyyy-mm-dd HH24:MI:SS".0"')
注意我添加的内容:双引号中的字符串,即.0。这将屏蔽任何十进制数字,而不仅仅是 0(但它必须是数字)。
如果某些输入可能有更多小数位,您可以扩展样板文本,例如“.000000000”如果格式模型中有“太多零”(与输入相比),那将起作用;但如果太少,就不会了。
【讨论】: