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

Too*_*ess 1 oracle date oracle11g

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

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

Lit*_*oot 5

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

SQL> create table test
  2    (datum date);

Table created.
Run Code Online (Sandbox Code Playgroud)

不要使用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.
Run Code Online (Sandbox Code Playgroud)

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

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

SQL> select * from test;

DATUM
--------
25.12.18
09.05.18
09.05.18
Run Code Online (Sandbox Code Playgroud)

我强迫它使用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
Run Code Online (Sandbox Code Playgroud)

另一种形式; 请注意,通过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
Run Code Online (Sandbox Code Playgroud)

使用具有某种格式的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>
Run Code Online (Sandbox Code Playgroud)

[编辑]

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>
Run Code Online (Sandbox Code Playgroud)

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