mySql 每隔一个工作日获取日期



以下查询返回开始日期和结束日期之间的所有星期二。在这种情况下,我还需要每隔一个星期二返回一次。

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 '2018-05-21' and '2018-08-31'
and dayname(DATES) in ('TUESDAY');

日期包含星期二的所有日期。我现在需要的是如何每隔一个星期二提取一次。出于某种原因,这个逃脱了我。

将 where 子句更改为

where DATES between '2018-05-21' and '2018-08-31'
and dayname(DATES) in ('TUESDAY')
and (date_format(DATES,'%U')%2 = 0);

该 date_format(( 函数将为您提供 00 到 53 年的一周,然后对 2 进行模测试。每当它是"0"时,它将是偶数周数。每当它是"1"时,它将是一个"奇数"周数。

在子查询中包含t0,然后将mod表达式添加到where

where DATES between '2018-05-21' and '2018-08-31' and t0 mod 2 = 1

请注意,这将任意选择开始计数期间的第一个或第二个星期二(您的问题不清楚是否可以(。

实际上有一种非常简单的方法可以正确计数:

where DATES between '2018-05-21' and '2018-08-31' and 
floor(datediff(dates, '2018-05-21') / 7) mod 2 = 0

这按第一个日期后的周数计算,并且仅返回每隔一周的日期。

最新更新