mysql一个表中的不同时间间隔

时间:2017-10-02 09:30:22

标签: mysql sql date intervals

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

UPDATE table SET NextMaintDate = MaintDate + INTERVAL 1 month

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果使用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,具体取决于您是要动态计算列还是实际保留数据。

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

答案 2 :(得分:0)

您可以将表修改为两列:

  • 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);

这不需要更改数据结构。