Too*_*ess 1 oracle date oracle11g
我正在Oracle 11g表中创建表,并遇到了一个格式为"YYYY-MM-DD"的日期字段.我不想为此使用varchar2,当我使用数字(5)时,它仍然接受输入.那么限制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)
所以:你不会让第三方应用程序访问该表,而是访问该视图.
归档时间: |
|
查看次数: |
234 次 |
最近记录: |