【发布时间】:2020-09-26 11:58:04
【问题描述】:
转换时出错
select to_date('Sep 26 00:15:00','DD/MM/YYYY HH24:MI:SS') from dual ;
ORA-01841: (full) year must be between -4713 and +9999, and not be 0 .
寻找解决方案
【问题讨论】:
转换时出错
select to_date('Sep 26 00:15:00','DD/MM/YYYY HH24:MI:SS') from dual ;
ORA-01841: (full) year must be between -4713 and +9999, and not be 0 .
寻找解决方案
【问题讨论】:
怎么样?当然,通过提供正确的格式掩码。
SQL> select
2 to_char(
3 to_date('Sep 26 00:15:00 2020', 'Mon dd hh24:mi:ss yyyy'),
4 'yyyy/mm/dd hh24:mi:ss'
5 ) result
6 from dual;
RESULT
-------------------
2020/09/26 00:15:00
SQL>
【讨论】:
使用TO_DATE(),您希望将字符串 - 'Sep 26 00:15:00' 转换为 Oracle DATE 类型 - 该类型在内部计算自纪元日期以来的秒数。
在 Unix 中,这将是 '1970-01-01 00:00:00',在我知道的其他一些数据库中是 '2000-01-01 00:00:00'。我不了解甲骨文。
所以你转换字符串:'Sep 26 00:15:00'。即:三字母英文月份名称缩写,一个空格,两位数的天,一个空格,两位数为24小时制的小时,一个冒号,两位数为分钟,一个冒号,两位数为第二。准确地说,今年什么都没有。 TO_DATE() 的第二个参数必须描述该格式。因此它将是:'Mon DD HH24:MI:SS'。
您使用的第二个参数在这种情况下绝对没有意义。如果你想玩,你可以使用它重新格式化转换后的DATE 类型,回到 ISO 格式的字符串,使用TO_CHAR():
SELECT
TO_CHAR(
TO_DATE('Sep 26 00:15:00','Mon DD HH24:MI:SS')
, 'YYYY-MM-DD HH24:MI:SS'
)
FROM dual;
【讨论】:
DATE 数据类型为 7 个字节,分别代表世纪、世纪、月、日、小时、分钟和秒。
'Dy Mon DD HH24:MI:SS YYYY'。我在这里找到了一个很好的文档:livesql.oracle.com/apex/livesql/file/…