【问题标题】:Compare Date with Trigger on Oracle SQL在 Oracle SQL 上比较日期和触发器
【发布时间】:2018-12-04 21:54:17
【问题描述】:

我有一个包含这些列的表格:

  • DateDebVal 日期
  • DateFinVal 日期
  • 是当前号码

我需要一个触发器来做这样的事情:

CREATE TRIGGER check_date
AFTER INSERT OR UPDATE ON tablename
FOR EACH ROW
BEGIN
        IF sysdate < DateFinVal
             set isCurrent = 1
        ELSE
             set isCurrent = 0
END;

我可以比较这些日期吗?使用触发器而不是视图或过程是个好主意吗?

【问题讨论】:

  • 不相关,但是:DATE 列(或值)没有格式。您在检索这些值时看到的任何格式都由您使用的 SQL 工具应用。
  • @a_horse_with_no_name 我认为它可能会导致一些错误,因为它并不总是采用相同的格式。
  • 再次重申:(真实的)DATE 值确实具有“格式”。
  • @a_horse_with_no_name 好的,谢谢

标签: sql oracle database-trigger


【解决方案1】:

绝对可以比较日期,但赋值是在 PL/SQL 中使用 := 完成的(而不是 set

如果要更改新插入行的值,则必须使用BEFORE 触发器:

CREATE TRIGGER check_date
BEFORE INSERT OR UPDATE ON tablename
FOR EACH ROW
BEGIN
  IF sysdate < :new.datefinval
    :new.iscurrent := 1;
  ELSE
    :new.iscurrent := 0;
  END IF;
END;
/

在线示例:https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=796347f1b5811448dddf2d0a532c2c2c

【讨论】:

    【解决方案2】:

    Sysdate 和 DateFinVal 属于 DATE 类型,因此您可以比较它们。这取决于你需要这个触发器。

    【讨论】:

    • 我需要这个触发器在 isCurrent 列中显示数据是否是最新的。
    • 好的,但请注意 sysdate 是对您的表进行插入或更新的日期。
    猜你喜欢
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 2013-04-09
    • 2013-04-04
    相关资源
    最近更新 更多