【问题标题】:Date time format in OracleOracle中的日期时间格式
【发布时间】: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) 
);

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

【问题讨论】:

    标签: sql oracle sqlplus


    【解决方案1】:

    msg_date + 间隔'1'秒

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

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

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

    【讨论】:

    • 问题是DATE格式是'DD/MM/YYYY'
    • 作为 varchar2?您可以转换为日期,但如果您只有最近一天的日期,那么我会认为添加 1 秒毫无意义?
    • 但是我可以在表格定义中看到它是一个日期,并且日期类型存储到最接近的秒。
    • 另见stackoverflow.com/q/8707556/2568649,您可能需要找到 max(msg_date) + interval '1' second where trunc(msg_date) = trunc(new:msg_date)
    猜你喜欢
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 2013-12-29
    • 1970-01-01
    相关资源
    最近更新 更多