mysql日期之间每月第n天的日期列表

g6baxovj  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(387)

需要有关基于以下条件返回日期列表的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子句。也许我的方法完全错了。
感谢所有的帮助。

oalqel3c

oalqel3c1#

这里有一个想法:一个月的第一个星期二必须是一个月的前七天之一。
月份的数字日值保证在1和7之间。我们可以用 DAYOFMONTH(t.foo) 或者 DAY(t.foo) .
也, DAYOFWEEK(t.foo) 会回来的 3 一个星期二。
或者我们可以用 DAYNAME(t.foo) 如果我们要计算一个字符串(如果我们要处理民族语言的差异,'tuesday'vs.'dienstag'vs.'mardi'等。
如果我需要限制 foo 为了“一个月的第一个星期二”,我会这样做:

WHERE DAYOFMONTH(t.foo) BETWEEN 1 AND 7 
    AND DAYOFWEEK(t.foo) = 3

相关问题