Oracle中的日期时间格式

Posted

技术标签:

【中文标题】Oracle中的日期时间格式【英文标题】:Date time format in Oracle 【发布时间】:2020-04-12 18:11:55 【问题描述】:

我是 sql 新手,正在研究一个示例。在我创建的表中,我有 cmets 表:

CREATE TABLE comments (
club       VARCHAR2(60) NOT NULL,
nick         VARCHAR2(35),
msg_date   DATE,
title        VARCHAR2(100) NOT NULL,
director   VARCHAR2(50) NOT NULL,
subject    VARCHAR2(100),
message    VARCHAR2(1500),
valoration NUMBER(2),
CONSTRAINT PK_COMMENTS PRIMARY KEY (nick,msg_date),
CONSTRAINT FK_COMMENTS_MEMBER FOREIGN KEY (nick,club) REFERENCES membership ON DELETE CASCADE,
CONSTRAINT FK_COMMENTS_MOVIES  FOREIGN KEY (title,director) REFERENCES movies,
CONSTRAINT CK_COMMENTS_VAL CHECK (valoration<11) 
);

我被要求创建一个执行以下操作的触发器: 如果评论与已存储的另一评论在同一日期到达,请使用日期注册 '一秒钟后'。 我遇到的问题是我不知道如何将“一秒”转换为日期。关于如何解决这个问题的任何想法?

【问题讨论】:

【参考方案1】:

msg_date + 间隔'1'秒

或者 msg_date + (1/(24*60*60))

然而,这整个场景充满了危险。在触发器中检查表中的现有消息时,该表可能在其他事务中发生变化,因此这里存在竞争条件的真正风险 - 两条消息都将现有消息增加 1 秒,然后将具有相同的日期。无论检查是在触发器还是应用程序代码中,情况都是如此。

如果这是一个真实世界的场景,我会避免触发,使用时间戳而不是日期,其精度介于毫秒和纳秒之间,并考虑如何处理与业务问题具有相同时间戳的消息的较低风险- 如果真的发生了会有什么影响。

【讨论】:

问题是DATE格式是'DD/MM/YYYY' 作为 varchar2?您可以转换为日期,但如果您只有最近一天的日期,那么我会认为添加 1 秒毫无意义? 但是我可以在表格定义中看到它是一个日期,并且日期类型存储到最接近的秒。 docs.oracle.com/cd/B28359_01/server.111/b28318/… 另见***.com/q/8707556/2568649,您可能需要找到 max(msg_date) + interval '1' second where trunc(msg_date) = trunc(new:msg_date)

以上是关于Oracle中的日期时间格式的主要内容,如果未能解决你的问题,请参考以下文章

Oracle DB 中的日期时间格式不正确,转换为小时和分钟

oracle日期转换问题

将一年中的某一天转换为某些日期格式具有 DDYYYY 并且某些日期格式具有 DDDYYYY 在 oracle 中的日期

Oracle中的日期格式问题

为啥 APEX 和 Oracle SQL Developer 中的日期格式不同?

Oracle 数据库 触发器 日期保存格式问题!