需要有关SQL语句的帮助,该语句将根据以下条件返回日期列表:
每个月的第n天。
我有以下语句,该语句基于具有开始和结束日期,重复(例如每x周)和工作日的重复模式返回日期列表。
CREATE DEFINER=`root`@`%` PROCEDURE `GETEVERYOTHERDATE`(IN _START DATE, IN _END DATE, IN _REC INT(5), IN _DAY VARCHAR(10))
BEGIN
SET CHARACTER SET 'UTF8';
select * from
(select adddate('1970-01-01',t4*10000 + t3*1000 + t2*100 + t1*10 + t0) DATES from
(select 0 t0 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,
(select 0 t1 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1,
(select 0 t2 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2,
(select 0 t3 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3,
(select 0 t4 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v
where DATES between _START and _END
and dayname(DATES) = _DAY
AND WEEK(DATES) % _REC = WEEK(_START) % _REC;
END
因此,如果条件是:
START = 2019-01-01
END = 2019-06-30
DAY = FIRST TUESDAY
RECURRENCE = every month
结果将是:
2019-01-01
2019-02-05
2019-03-05
2019-04-02
2019-05-07
2019-06-04
因此我无法提出适当的where子句。也许我的方法是完全错误的。
感谢您的帮助。
答案 0 :(得分:1)
这里有个主意:一个月的第一个星期二必须是该月的前七个天之一。
保证每月的数字天数值介于1到7之间。我们可以使用DAYOFMONTH(t.foo)
或DAY(t.foo)
来进行评估。
此外,DAYOFWEEK(t.foo)
将在周二返回3
。
或者,如果要评估字符串(如果要处理国家语言差异,例如“星期二”与“ Dienstag”与“ Mardi”等),则可以使用DAYNAME(t.foo)
如果我需要将foo
的日期或日期时间值限制为“一个月的第一个星期二”,则可以这样做:
WHERE DAYOFMONTH(t.foo) BETWEEN 1 AND 7
AND DAYOFWEEK(t.foo) = 3