如何在日期列的MySQL中添加天数?

时间:2017-11-27 02:25:07

标签: php mysql

我在数据库中有一个简单的表。该表格包含date_startadded_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 

fiddle

注意:
我也接受PHP解决方案,如果它在MySQL中无法解决

1 个答案:

答案 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

等等。现在,您可以通过预先定义该列作为起点来简化开始日期固定列值的事实,但我不了解您的环境,温度/永久性用来打电话的桌子等,足以得到你想要的答案。