sql - 如何在没有时间的情况下仅在 Oracle 19c 中保存日期
问题描述
我不习惯 with Oracle
,同样的事情可以在MySQL
. 我的任务是我必须在 Oracle 19c 中保存日期,但没有时间。我的应用程序语言是 J2EE。在做了一些搜索后找到了一些解决方案,但我的要求还没有被满足。
解决方案 1: Insert a Datetime Value Using the TO_DATE Function
CREATE TABLE abe_student (
first_name VARCHAR2(50),
last_name VARCHAR2(50),
date_of_birth DATE
);
INSERT INTO abe_student (first_name, last_name, date_of_birth)
VALUES ('John', 'Doe', TO_DATE('2016/01/16', 'yyyy/mm/dd'));
INSERT INTO abe_student (first_name, last_name, date_of_birth)
VALUES ('John', 'Doe', TO_DATE('16/01/2016', 'dd/mm/yyyy'));
该溶液为 10g。我试过这个,但它是用全零插入时间。两个查询都给出相同的结果。
解决方案二(10g):trunc()
从您的 DATE 列中删除所有时间(更新 yourtable set yourdatecolumn = trunc(yourdatecolumn))
通过使用 check (yourdatecolumn = trunc(yourdatecolumn)) 在列上放置检查约束,确保所有未来日期不包含时间部分
调整所有 INSERT 和 UPDATE 语句,或者 - 如果你幸运的话 - 调整你的 API,只插入 TRUNCed 日期。
根据说明,查询应如下所示:
update ABE_STUDENT set ABE_STUDENT.DATE_OF_BIRTH = trunc(DATE_OF_BIRTH);
执行步骤 1 后,我检查了数据库,但没有任何变化。
TRUNC()
不工作,但工作TO_CHAR()
正常。
SELECT TRUNC(DATE_OF_BIRTH), to_char(DATE_OF_BIRTH,'MM/DD/YYYY') FROM ABE_STUDENT
让我们介绍一下为什么我需要这种格式的数据的用例。这个概念将用于金融服务交易分析,我只需要日期。在复杂的查询时间,使用另一种方法来格式化日期,将是一个性能问题。
使用后更新
:TRUNC(DATE_OF_BIRTH, 'DAY')
SELECT TRUNC(DATE_OF_BIRTH, 'DAY'), to_char(DATE_OF_BIRTH,'MM/DD/YYYY') FROM ABE_STUDENT
解决方案
你不能。
Oracle 中的ADATE
是一种二进制数据类型,它总是包含7 个字节,分别代表世纪、世纪、月、日、小时、分钟和秒。
如果要显示DATE
没有时间组件的数据类型,请将其转换为格式化字符串(使用TO_CHAR
查询中的函数或用于访问数据库的 3rd 方应用程序中的函数)。
如果要存储DATE
不考虑时间分量的值,则插入值,以便它们始终在午夜具有时间分量;您可以使用CHECK
约束来强制执行此操作。