本文出自[公众号]:DBA闲思杂想录
在Oracle数据库中,我们遇到的日期时间绝大部分是公元后的日期时间,那么如何显示公元前的日期时间呢? 这种需求非常少见,相信一些同学都不清楚如何输出公元前日期时间,下面简单的介绍一下。
如果你见到下面TO_DATE(‘ 2024-02-01 00:00:00’, ‘SYYYY-MM-DD HH24:MI:SS’)这种设置日期格式的形式,请不要奇怪。虽然我们平时可能都是使用’YYYY-MM-DD HH24:MI:SS’这个格式形式,但是这种TO_DATE(‘ 2024-02-01 00:00:00’, ‘SYYYY-MM-DD HH24:MI:SS’)格式也是合法的日期格式,只是不常见而已。
SQL> SELECT TO_DATE('2024-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS') AS DATE_TIME_FRT FROM DUAL;
DATE_TIME_FRT
-------------------
2024-02-01 00:00:00
1 row selected.
SQL> SELECT TO_DATE(' 2024-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS') AS DATE_TIME_FRT FROM DUAL;
DATE_TIME_FRT
-------------------
2024-02-01 00:00:00
1 row selected.
SQL>
初看上面脚本,似乎SYYYY跟YYYY没有啥区别,那么这个S到底代表啥意思呢?其实S前缀指定如果遇公元前的日期,会在日期前加(-),也就是说如果时间是公元前的时间,那么这种格式会将公元前的时间加上一个“-”,下面我们来演示一下:
--实验脚本
SQL> CREATE TABLE TEST(COL_TIME DATE);
Table created.
SQL> INSERT INTO TEST
2 SELECT TO_DATE(' 2024-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS') FROM DUAL;
1 row created.
SQL>
SQL>
SQL> INSERT INTO TEST
2 SELECT TO_DATE('-0100-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS') FROM DUAL;
1 row created.
SQL> commit;
如果想插入公元前的日期,如果不设置为SYYYY,就会遇到ORA-01841: (full) year must be between -4713 and +9999, and not be 0这个错误,如下所示:
SQL> INSERT INTO TEST
2 SELECT TO_DATE('-0100-02-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS') FROM DUAL;
SELECT TO_DATE('-0100-02-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS') FROM DUAL
*
ERROR at line 2:
ORA-01841: (full) year must be between -4713 and +9999, and not be 0
测试如下所示:
SQL> ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';
Session altered.
SQL> SELECT * FROM TEST;
COL_TIME
-------------------
2024-02-01 00:00:00
0100-02-01 00:00:00
2 rows selected.
SQL> ALTER SESSION SET NLS_DATE_FORMAT='SYYYY-MM-DD HH24:MI:SS';
Session altered.
SQL> SELECT * FROM TEST;
COL_TIME
--------------------
2024-02-01 00:00:00
-0100-02-01 00:00:00
2 rows selected.
格式化时,如何将公元前的日期输出,如下所示,也是在格式化时,使用SYYYY-MM-DD HH24:MI:SS这种格式。
SQL> SELECT TO_CHAR(COL_TIME, 'YYYY-MM-DD HH24:MI:SS') FROM TEST;
TO_CHAR(COL_TIME,'Y
-------------------
2024-02-01 00:00:00
0100-02-01 00:00:00
2 rows selected.
SQL> SELECT TO_CHAR(COL_TIME, 'SYYYY-MM-DD HH24:MI:SS') FROM TEST;
TO_CHAR(COL_TIME,'SY
--------------------
2024-02-01 00:00:00
-0100-02-01 00:00:00
2 rows selected.
在这个互联网时代,信息是爆炸的,知识是过载的,观点是鼓噪的,热点是速朽的。
而反过来,专注在一件事上,精益求精、持之以恒的态度和行动,则是最稀少和最珍贵的.——《精进》
原文始发于微信公众号(DBA闲思杂想录):Oracle如何显示公元前日期
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/228057.html