【问题标题】:Add a first day column to table with expression使用表达式将第一天列添加到表中
【发布时间】:2019-01-08 09:21:53
【问题描述】:

我正在使用下面的代码将月份的第一天列添加到表中,并带有一个自动更新的表达式。但它会引发语法错误。有人请帮忙。

ALTER TABLE `abc`.`t1` 
ADD COLUMN `First_Day` DATE NULL DEFAULT select DATE_ADD(DATE_ADD(LAST_DAY(report_date),
        INTERVAL 1 DAY),
    INTERVAL - 1 MONTH) AFTER `Totals`;

【问题讨论】:

  • 第一天是星期日、星期一、星期二还是第一天是 01?

标签: mysql date alter-table dateadd


【解决方案1】:

mysql 不允许使用表达式来设置默认值。

您可以为此创建触发器。

delimiter $$
CREATE TRIGGER test_trigger BEFORE INSERT ON `product` 
FOR EACH ROW SET
    NEW.myCol= DATE_ADD(DATE_ADD(LAST_DAY(new.report_date),
        INTERVAL 1 DAY),
    INTERVAL - 1 MONTH);
END$$
delimiter;

【讨论】:

    【解决方案2】:

    我会质疑您为什么希望存储它,但如果您必须生成列可能会这样做。

    drop table if exists t;
    create table t(id int, report_date date);
    
    ALTER TABLE t
    ADD COLUMN `First_Day` DATE as 
    (date_add(date_add(last_day(date(report_date)),interval 1 day),interval -1 month));
    
    insert into t (id,report_date) values
    (1,'2018-01-08'),(2,'2018-02-09');
    
    select * from t;
    
     +------+-------------+------------+
    | id   | report_date | First_Day  |
    +------+-------------+------------+
    |    1 | 2018-01-08  | 2018-01-01 |
    |    2 | 2018-02-09  | 2018-02-01 |
    +------+-------------+------------+
    2 rows in set (0.00 sec)
    

    如果您选择采用这种方式或通过触发器,您将不得不编写一次性更新来填充现有数据的此列。

    【讨论】:

      猜你喜欢
      • 2018-09-05
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      相关资源
      最近更新 更多