我在数据库中有一个简单的表。该表格包含date_start
和added_days
列。这是正常SELECT
的表格:
id date_start added_days
1 2017-10-10 2
2 2017-10-10 4
3 2017-10-10 6
4 2017-10-10 6
5 2017-10-10 3
我知道如何将日期添加到date_start
列。但是,如何使date_start
值与之前的date_start
相同?
我当前的SELECT
:
SELECT DATE_ADD(date_start, INTERVAL added_days DAY) AS 'new_date',added_days FROM test
id new_date added_days
1 2017-10-12 2
2 2017-10-14 4
3 2017-10-16 6
4 2017-10-16 6
5 2017-10-13 3
我的预期输出:
id new_date added_days
1 2017-10-10 2
2 2017-10-12 4
3 2017-10-16 6
4 2017-10-22 6
5 2017-10-28 3
注意:
我也接受PHP解决方案,如果它在MySQL中无法解决
答案 0 :(得分:1)
这个概念可以用同样的方式this answer needed完成。我使用MySQL变量就像一个内联程序。
select
@lastDate := date_add( if( @lastNumDays = 0, date_start, @lastDate ), INTERVAL @lastNumDays DAY ) as new_Date,
@lastNumDays := added_days as added_days
from
YourTable ,
( select @lastDate := '2017-01-01',
@lastNumDays := 0 ) SQLVars;
“SQLVARS”别名用于内联创建变量...一个虚假的占位符日期,以及默认为0的最后天数,因此实际上没有添加任何天数。
选择字段将使用 - 在第一次传递实际的第一个日期时,将零天添加为开始,然后,将该值设置为@lastDate变量以用于下一个记录。 NEXT字段将日期分配到@lastNumDays变量中,以用于下一条记录的“Date_Add()”过程。
我的工作解决方案可以在SQL Fiddle demo
找到澄清。
两个变量用于保存“最后日期”,以及一个用于在当前记录之后提前的天数。因此,要按顺序处理行,请将其视为......
@lastDate ='2017-01-01' - 充当占位符声明的变量 @lastNumDays = 0 - 另一个占位符,用于后续添加到基准日期
First Record,应用IF(),@ lastNumDays = 0,因此它将“Date_Start”放入@lastDate变量,但成为“New_Date”列。接下来,将added_Days和store存储到@lastNumDays变量中,并成为“added_Days”列。
因此,根据您的样本数据处理第一行的末尾,
@lastDate = '2017-10-10' and
@lastNumDays = 2
现在,我们到达您的数据的第二行。 IF()在@lastNumDays中有一个值,并使用@lastDate代替它,并增加2天。所以现在
@lastDate = '2017-10-12'
@lastNumDays = 4
下一条记录...适用于10月12日添加4天并成为
@lastDate = '2017-10-16'
@lastNumDays = 6
等等。现在,您可以通过预先定义该列作为起点来简化开始日期固定列值的事实,但我不了解您的环境,温度/永久性用来打电话的桌子等,足以得到你想要的答案。