【问题标题】:mysql Different time intervals in one tablemysql 一张表不同的时间间隔
【发布时间】:2017-10-02 09:30:21
【问题描述】:

我们在大学创建了一个包含不同类型设备的数据库,这些设备需要在不同的日期进行维护。维护间隔也不同(有时每个月,有时每 2 周等)。 现在我们想要一个列,如果您更改维护日期,它会自动更新。我们一般使用的是

UPDATE table SET NextMaintDate = MaintDate + INTERVAL 1 month

因此,NextMaintDate 的每个日期都比 MaintDate 晚一个月。是否有可能使用不同的 MaintDate 有不同的间隔?

【问题讨论】:

    标签: mysql sql date intervals


    【解决方案1】:

    使用CASE WHEN:

    UPDATE table SET NextMaintDate = 
      CASE WHEN type = 'monthly' THEN MaintDate + INTERVAL 1 month  
           WHEN type = 'weekly' THEN MaintDate + INTERVAL 1 week
           WHEN type = 'daily' THEN MaintDate + INTERVAL 1 day
      END
    

    【讨论】:

    • 当我尝试这个时,我得到错误 Unknown column 'type' in 'field list'
    • @Kiekster 。 . .您必须在数据中包含该列。
    • @Kiekster:必须有一些东西表明适用的间隔。我用名为type 的列做了一个例子。您的记录将包含您将使用的另一列或其他列。
    【解决方案2】:

    如果使用 MySQL 5.7.6 或更高版本,您可以在表定义中使用计算列:

    CREATE TABLE yourTable (
        id INTEGER NOT NULL PRIMARY KEY,
        MaintDate DATETIME NOT NULL,
        ...
        NextMaintDate AS DATE_ADD(MaintDate, INTERVAL 1 MONTH)
    );
    

    现在,每当 MaintDate 列更新时,NextMaintDate 也会自动更新(至少在逻辑上)。

    您可以为生成的列选择VIRTUALSTORED,具体取决于您是要动态计算列还是实际持久化数据。

    对于其他区间,您可以添加更多计算列。

    【讨论】:

      【解决方案3】:

      您将修改您的表格以包含两列:

      • maintenance_interval_type 是区间的类型
      • maintenance_interval_num 是号码

      那么你可以这样做:

      update t
          set NextMaintDate = (case when maintenance_interval_type = 'month' 
                                    then maintdate + interval maintenance_interval_num month
                                    when maintenance_interval_type = 'week' 
                                    then maintdate + interval maintenance_interval_num week
                                    when maintenance_interval_type = 'day' 
                                    then maintdate + interval maintenance_interval_num day
      
                                else maintenance_interval_num
                           end);
      

      我应该注意,您也可以使用显式类型来执行此操作。像这样的:

      update t
          set NextMaintDate = (case when equipment_type in ( . . . )
                                    then maintdate + interval 2 week
                                    when maintenance_interval_type = 'week' 
                                    else maintdate + interval 1 month
                               end);
      

      这不需要改变数据结构。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多