oracle 11g 中格式"YYYY-MM-DD"领域的最佳数据类型是什么?



我正在Oracle 11g表中创建表,并遇到了一个格式为"YYYY-MM-DD"的日期字段。 我不想为此使用 varchar2,当我使用 number(5( 时,它仍然接受输入。那么限制 5 在这里的含义是什么?

请建议我在这里可以使用的最佳数据类型。

显然,这是一个日期格式掩码。如果要将日期存储到该列中,则应使用DATE数据类型,例如

SQL> create table test
2    (datum date);
Table created.

不要为此使用VARCHAR2(将字符串放入其中,而不是日期(或NUMBER(将数字放入其中,而不是日期(数据类型。你会比你想象的更早后悔。

我将在表中输入一些值,展示如何做到这一点的不同方法 - 重要的是在其中插入日期而不是字符串。永远不要依赖 Oracle,将您可能提供的字符串隐式转换为日期。迟早,它会产生错误。

SQL> insert into test values (date '2018-12-25');
1 row created.
SQL> insert into test values (to_date('09.05.2018', 'dd.mm.yyyy'));
1 row created.
SQL> insert into test values (sysdate);
1 row created.

现在,有几种选择该值的方法:

这个以我的数据库的 NLS 设置当前设置的格式返回日期:

SQL> select * from test;
DATUM
--------
25.12.18
09.05.18
09.05.18

我强制它使用 ALTER SESSION 以所需格式返回值:

SQL> alter session set nls_date_format = 'yyyy-mm-dd';
Session altered.
SQL> select * from test;
DATUM
----------
2018-12-25
2018-05-09
2018-05-09

另一种格式;请注意,通过 SYSDATE 函数(返回 DATE(插入的值包含日期和时间部分。在前面的例子中,它是"不可见的":

SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi:ss';
Session altered.
SQL> select * from test;
DATUM
-------------------
25.12.2018 00:00:00
09.05.2018 00:00:00
09.05.2018 08:03:50

使用具有某种格式(例如 dd-mon-yyyy(的TO_CHAR函数。我还要求Oracle将月份名称"翻译"为英语(因为我的数据库使用克罗地亚语(:

SQL> select to_char(datum, 'dd-mon-yyyy', 'nls_date_language = english') datum from test;
DATUM
-----------
25-dec-2018
09-may-2018
09-may-2018
SQL>

[编辑]

Oracle不会以任何"人类"可读的格式存储DATE值(在互联网上还有更多内容可以阅读,Google可以阅读(。它是一个格式掩码,向您表示该值。

强烈建议不要将日期存储到任何数据类型列中,而是将日期存储到DATE中。这是一个定时炸弹,等待爆炸(然后它会受伤(。没有人阻止您输入值"1234-99-66"或"12-345-678";那你会怎么处理它呢?

考虑在表顶部创建一个视图,该视图使用TO_CHAR函数并以所需的格式("yyyy-mm-dd"(返回值。表中的 DATE 数据类型列确保值有效,并且视图将允许第三方应用程序接受它认为合适的值。

例如:

SQL> create view v_test as
2    select to_char(datum, 'yyyy-mm-dd') datum
3    from test;
View created.
SQL> select * from v_test;
DATUM
----------
2018-12-25
2018-05-09
2018-05-09
SQL>

因此:您不会让第三方应用程序访问表,而是允许视图访问。

最新更新