oracle 11g格式“YYYY-MM-DD”字段的最佳数据类型是什么?

时间:2018-05-09 04:25:46

标签: oracle date oracle11g

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

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

1 个答案:

答案 0 :(得分: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

使用具有某种格式的TO_CHAR函数(例如dd-mon-yyyy)。我也要求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>

所以:你不会让第三方应用程序访问该表,而是让视图访问。