[英]How to save only Date in Oracle 19c without time
我不习惯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 中的DATE
是一种二进制数据类型,它始终包含7 个字节,分别代表世纪、世纪、月、日、小时、分钟和秒。
如果要显示不带时间组件的DATE
数据类型,请将其转换为格式化字符串(在查询或用于访问数据库的第 3 方应用程序中使用TO_CHAR
function)。
如果您想在不考虑时间分量的情况下存储DATE
,则插入这些值,以便它们始终在午夜具有时间分量; 您可以使用CHECK
约束来强制执行此操作。
您可以使用生成的列来生成字符串形式。 我会使用:
alter table abe_student add column dob_string varchar2(255)
generated always as (to_char(date_of_birth, 'YYYY-MM-DD'));
(我非常喜欢标准日期格式。)
然后您可以使用字符串列查询表。 瞧。 它会完全按照您的意愿出现。
您可以使用check
约束确保该列没有时间组件:
alter table abe_student add constraint chk_abe_student_dob
check (date_of_birth = trunc(date_of_birth));
或者,您可以将 GUI 界面配置为仅显示date
列的日期。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.