需要有关基于以下条件返回日期列表的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条答案
按热度按时间oalqel3c1#
这里有一个想法:一个月的第一个星期二必须是一个月的前七天之一。
月份的数字日值保证在1和7之间。我们可以用
DAYOFMONTH(t.foo)
或者DAY(t.foo)
.也,
DAYOFWEEK(t.foo)
会回来的3
一个星期二。或者我们可以用
DAYNAME(t.foo)
如果我们要计算一个字符串(如果我们要处理民族语言的差异,'tuesday'vs.'dienstag'vs.'mardi'等。如果我需要限制
foo
为了“一个月的第一个星期二”,我会这样做: