首页 > 解决方案 > 如何在没有时间的情况下仅在 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()

  1. 从您的 DATE 列中删除所有时间(更新 yourtable set yourdatecolumn = trunc(yourdatecolumn))

  2. 通过使用 check (yourdatecolumn = trunc(yourdatecolumn)) 在列上放置检查约束,确保所有未来日期不包含时间部分

  3. 调整所有 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

truc 和 to_char 之后的结果

让我们介绍一下为什么我需要这种格式的数据的用例。这个概念将用于金融服务交易分析,我只需要日期。在复杂的查询时间,使用另一种方法来格式化日期,将是一个性能问题。

使用后更新TRUNC(DATE_OF_BIRTH, 'DAY')

SELECT TRUNC(DATE_OF_BIRTH, 'DAY'), to_char(DATE_OF_BIRTH,'MM/DD/YYYY')  FROM ABE_STUDENT

在此处输入图像描述

标签: sqloracleoracle19c

解决方案


你不能。

Oracle 中的ADATE是一种二进制数据类型,它总是包含7 个字节,分别代表世纪、世纪、月、日、小时、分钟和秒。

如果要显示DATE没有时间组件的数据类型,请将其转换为格式化字符串(使用TO_CHAR查询中的函数或用于访问数据库的 3rd 方应用程序中的函数)。

如果要存储DATE不考虑时间分量的值,则插入值,以便它们始终在午夜具有时间分量;您可以使用CHECK约束来强制执行此操作。


推荐阅读