sql 语句系列(月份的第一个星期的星期一和最后一个星期的星期一)[八百章之第二十一章]

mysql

select y.first_monday,CASE MONTH(ADDDATE(y.first_monday,28)) 
when mth then ADDDATE(y.first_monday,28) 
else ADDDATE(y.first_monday,21) end last_monday
from(
select case sign(DAYOFWEEK(x.dy)-2)
       when 0  then x.dy
       when -1 then ADDDATE(x.dy,ABS(DAYOFWEEK(x.dy)-2))
       when 1  then ADDDATE(x.dy,(7-(DAYOFWEEK(x.dy)-2))) END first_monday, mth  
from(
select DATE_ADD(CURRENT_DATE,INTERVAL -DAY(CURRENT_DATE)+1 DAY) dy,MONTH(CURRENT_DATE) mth
from T1
) x
) y

解析:
在前一章中介绍了:

select DATE_ADD(CURRENT_DATE,INTERVAL -DAY(CURRENT_DATE)+1 DAY) dy,MONTH(CURRENT_DATE) mth
from T1

为获取这个月的第一天。
case sign(DAYOFWEEK(x.dy)-2)
when 0 then x.dy
when -1 then ADDDATE(x.dy,ABS(DAYOFWEEK(x.dy)-2))
when 1 then ADDDATE(x.dy,(7-(DAYOFWEEK(x.dy)-2))) END first_monday, mth
因为DAYOFWEEK 可以获取星期数值,星期六为7,星期天为1 ,星期1为2。

这里判断第一天是不是星期一,如果是星期天,也就是-1,那么下一天就是星期一。
如果是星期二到星期六,那么就算,下一个星期一是多少。

select y.first_monday,CASE MONTH(ADDDATE(y.first_monday,28)) 
when mth then ADDDATE(y.first_monday,28) 
else ADDDATE(y.first_monday,21) end last_monday

这一段是我们已经获取了第一个星期的星期一。
那么最后一个星期一,要不就是加28,4个星期,要不就是加21,3个星期。

sql server

with x(dy,mth,is_monday)as (
select temp.dy,temp.mth,case when DATEPART(DW,temp.dy)=2 then 1 else 0 end
from(
select DATEADD(day,-day(GETDATE())+1,GETDATE()) dy,MONTH(GETDATE()) mth
from T1
) temp
union all
select dateadd(DAY,1,x.dy),mth,case when 
DATEPART(dw,dateadd(day,1,x.dy))=2 then 1 else 0 end
from x
where MONTH(DATEADD(DAY,1,dy))=mth
)

select MIN(x.dy) first_month,MAX(x.dy) last_month
from x

sql server 使用递归。和mysql一样得到月份的第一天,一直递归,判断这个月的每一天是否是星期一。

你可能感兴趣的:(sql 语句系列(月份的第一个星期的星期一和最后一个星期的星期一)[八百章之第二十一章])