日期之间第一个月的第n天的MYSQL日期列表

时间:2019-01-03 20:10:42

标签: mysql

需要有关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子句。也许我的方法是完全错误的。

感谢您的帮助。

1 个答案:

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