【问题标题】:How to calculate derived attributes for dates in CREATE TABLE query. - MySQL如何计算 CREATE TABLE 查询中日期的派生属性。 - MySQL
【发布时间】:2014-02-10 19:08:09
【问题描述】:

我正在建立一个包含各种设备的数据库,其中一个实体包含该设备的保修信息。我想要的属性之一是“Is_Valid”派生属性,它基本上是“无效”或“有效”,具体取决于保修条款的结束日期是否已过。

我可以用这个查询在 SQL 中做到这一点:

CREATE TABLE Warranty(
    Warranty_ID     varchar(5),
    Begin_Date      date,
    End_Date        date,
    Terms           varchar(15),
    Is_Valid as (IIF((GetDate() > Begin_Date) AND (GetDate() < End_date), 'valid','not valid')),
    Primary Key (Warranty_ID));

但是,我一直在尝试在 MySQL 中完成此操作,但无法使其正常工作。我让它工作的唯一方法是使用UPDATE Warranty 查询使用case,但我宁愿数据库自动执行此操作。如果我理解错了,请原谅我,因为我是数据库结构和实现的新手。谢谢。

【问题讨论】:

  • AFAIK,你不能在 MySQL 中这样做。您可以做的是定义ON BEFURE INSERT & ON BEFORE UPDATE 触发器,或者您可以使用SELECT 查询定义VIEW

标签: mysql sql database date derived


【解决方案1】:

首先,在 MySQL 方言中,GetDate() 变为 CURDATE()IIF 变为 IF

此外,我建议您使用BETWEEN 来检查一系列值:这会改变 Begin_Date 和 End_Date 的行为(保修将有效包括这些日期)但也许这是还有你喜欢的。

您可以在其顶部使用表格和视图,如下所示:

CREATE TABLE Warranty(
    Warranty_ID     varchar(5),
    Begin_Date      date,
    End_Date        date,
    Terms           varchar(15),
    Primary Key (Warranty_ID));

CREATE VIEW vw_Warranty AS
SELECT
    Warranty_ID,
    Begin_Date,
    End_Date,
    Terms,
    IF(CURDATE() BETWEEN Begin_Date AND End_date, 'valid', 'not valid') as IS_Valid;

【讨论】:

  • IF() 函数 (dev.mysql.com/doc/refman/5.0/en/…) 可能是 IIF() 的更好替代品。否则,答案看起来不错。
  • 谢谢@TimBurch,用IF(和BETWEEN)更新了我的答案。
  • 我以前从未使用过视图,但我尝试过你的(在最后添加“FROM Warranty”之后),它似乎奏效了!所以,基本上如果我想查询/拉出某个项目是否超出保修期,我将不得不查询 vw_Warranty 视图而不是 Warranty 表?
  • @astalepancake 完全正确。问题将是所有其他想法(TRIGGER 和 CHECK),它们都不是,例如在 SELECT 期间定期评估或评估。但是,每次访问时都会重新创建一个视图,因此始终会根据当前的 CURDATE() 检查它。
  • 好的,非常感谢您的帮助,正是我想要的!
猜你喜欢
  • 2013-04-13
  • 2019-07-23
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多