我遇到了一个问题,例如我需要在日期中添加1个月而<=其他日期。
例如:
set @startdt = '2018-01-15';
set @maxdt = '2018-05-31';
set @dt = @startdt;
while (@dt <= @maxdt) do
select @dt;
set @dt = date_add(@dt, interval 1 month);
end while
输出将为
2018-01-15
2018-02-15
2018-03-15
2018-04-15
2018-05-15
以上是正确的,但如果@ startdt ='2018-01-31',则输出为
2018-01-31
2018-02-28
2018-03-28
2018-04-28
2018-05-28
理想情况下,我需要返回的内容(当@startdt='2018-01-31'
时)
2018-01-31
2018-02-28
2018-03-31
2018-04-30
2018-05-31
我尝试了以下
set @d = cast('2018-01-31' as datetime);
set @dy = day(@d);
set @d2 = date_add(@d, interval 1 month);
set @d2y = cast(year(@d2) as char(4));
set @d2m = cast(month(@d2) as char(2));
set @d2i = cast(STR_TO_DATE(concat(@d2y,',',@d2m,',',@dy), '%Y, %m, %d') as datetime);
set @d3 = date_add(@d2i, interval 2 month);
set @d3y = cast(year(@d3) as char(4));
set @d3m = cast(month(@d3) as char(2));
set @d32 = STR_TO_DATE(@d3y,@d3y, @dy, '%Y, %m, %d');
select @d, @d2i, @d3, @d32, @d2y, @d2m, @dy;
,因为@d2i
以2018-02-31
的形式出现,所以输出没有意义。 @d3
和@d32
以NULL
的形式出现。
我想我错过了树木的木头。任何人提供的任何帮助将不胜感激。
答案 0 :(得分:0)
最简单的解决方案是将日期一次增加一个月,而不是一次在日期上增加一个月:
set @startdt = '2018-01-31';
set @maxdt = '2018-05-31';
set @m = 1;
set @dt = @startdt;
while (@dt <= @maxdt) do
select @dt;
set @dt = @startdt + interval m month;
set @m = @m + 1;
end while
输出:
2018-01-31
2018-02-28
2018-03-31
2018-04-30
2018-05-31