1

我有一张带有start_date,end_date和间隔的表格。我想更新end_date的值start_date和间隔。

create table date_test (
    start_date      date,
    end_date        date,
    date_interval   varchar(45)
);

我使用的值date_interval- INTERVAL 1 WEEK, + INTERVAL 1 MONTH

我想做类似的事情:

UPDATE date_test SET end_date = date( concat( start_date, " ", date_interval));

但我收到这个警告:

1292 截断不正确的日期值:'2012-01-01 - INTERVAL 1 week'

如何强制此日期在更新之前进行评估?

4

3 回答 3

1

乔纳森·莱弗勒 说:

几乎; 不过,手册页和问题之间有一个至关重要的区别。该手册讨论了 DATE_ADD(date_value, INTERVAL '1' DAY) 等,而问题是将“字符串”值作为第二个参数。我担心这个问题需要一个函数来将字符串转换为 INTERVAL 类型。MySQL 中似乎没有“TO_INTERVAL”函数。

这是一个函数,它将日期作为第一个参数,将字符串间隔作为第二个参数。

只需将以下存储过程添加到您的数据库中:

CREATE PROCEDURE my_date_add(d DATE, i VARCHAR(50))
BEGIN
  DECLARE sign CHAR(1);
  DECLARE x INT;

  SET sign = SUBSTRING_INDEX(i, ' ', 1);
  SET x = SUBSTRING_INDEX(SUBSTRING_INDEX(i, ' ', -2), ' ', 1);

  IF sign = '-' THEN
    SET x = -x;
  END IF;

  CASE SUBSTRING_INDEX(i, ' ', -1)
    WHEN 'DAY' THEN SELECT DATE_ADD(d, INTERVAL x DAY);
    WHEN 'WEEK' THEN SELECT DATE_ADD(d, INTERVAL x WEEK);
    WHEN 'MONTH' THEN SELECT DATE_ADD(d, INTERVAL x MONTH);
  END CASE;
END

然后你应该能够像这样更新你的表:

UPDATE date_test SET end_date = my_date_add(start_date, date_interval);
于 2012-07-04T00:33:36.720 回答
0

你想要做的是:

UPDATE date_test SET end_date = DATE_ADD(start_date, date_interval);

但我不确定使用 date_interval 作为第二个参数是否有效,请告诉我们是否有效。

您会在 MySQL 文档中找到很多有用的示例,请参阅DATE_ADD()函数描述。

于 2012-07-03T01:07:13.480 回答
0

MySQL 不支持值评估。因此,您不能直接使用 UPDATE 语句。

在这种情况下,我建议您使用以下方法:

  • 编写一个 SELECT...INTO OUTFILE 语句,该语句将生成一个 UPDATE 语句列表并将所有这些语句输出到文件中,然后运行这个 sript。

  • 或者编写一个存储过程,该过程将在表上打开一个游标date_test,在循环中使用准备好的语句为每条记录一个一个地生成和执行 UPDATE 语句。

询问,如果您对解决方案有疑问。

于 2012-07-03T05:38:06.337 回答