• 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一样得到月份的第一天,一直递归,判断这个月的每一天是否是星期一。

  • 相关阅读:
    smtplib.py
    淘宝链接中的spm参数
    with 上下文管理
    python RecursionError: maximum recursion depth exceeded while calling
    GraphQL两年实战
    Exception 异常处理
    Simple decorator that intercepts connection errors and ignores these if settings specify this.
    namedtuple
    服务治理在猫眼娱乐的演进之路
    路由、限流、熔断 微服务治理
  • 原文地址:https://www.cnblogs.com/aoximin/p/12679057.html
Copyright © 2020-2023  润新知