如何使用表格间隔计算日期

时间:2012-07-03 00:15:31

标签: mysql date intervals

我的表格中包含start_dateend_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周'

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

3 个答案:

答案 0 :(得分:1)

乔纳森莱弗勒说:

  

近;但是,手册页和问题之间存在着重要的区别。本手册讨论了DATE_ADD(date_value,INTERVAL'1'DAY)等,而问题是将'string'值作为第二个参数。我担心这个问题需要一个函数来将字符串转换为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);

答案 1 :(得分:0)

您想要做的是:

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

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

您将在MySQL文档中找到许多有用的示例,请参阅DATE_ADD()函数说明。

答案 2 :(得分:0)

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

在这种情况下,我建议你这些方式:

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

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

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