我的表格中包含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周'
如何在更新前强制评估此日期?
答案 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语句。
问问,如果您对解决方案有疑问。