• TSQL 生成一个简易的 公历年历 TSQL 含日期所在月及年的周次


    --增加了日期所在月及年的周次!
    --星期日要算在"上一周"!(注意 WeekOfYear、WeekOfMonth 与 MyWeekOfYear、MyWeekOfMonth 的区别)
    --注意 datename 的值会因 SQL Server 语言版本或日期格式有所差异!
    --本测试环境为: SQL Server 2000 简体中文版 + Windows 简体中文版


    declare @ datetime
    set @ = '1995-02-25 11:00:50' -- 1995-01-01 正好是个星期日

    select @ as 日期
          ,dateadd(year,datediff(year,0,@),0) as 所在年的第一天
          ,dateadd(year,1+datediff(year,0,@),0)-1 as 所在年的最后一天
          ,dateadd(quarter,datediff(quarter,0,@),0) as 所在季的第一天
          ,dateadd(quarter,1+datediff(quarter,0,@),0)-1 as 所在季的最后一天
          ,dateadd(month,datediff(month,0,@),0) as 所在月的第一天
          ,dateadd(month,1+datediff(month,0,@),0)-1 as 所在月的最后一天
          ,dateadd(week,datediff(week,0,@),0) as 所在周的第一天
          ,dateadd(week,1+datediff(week,0,@),0)-1 as 所在周的最后一天


    select
     dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0))))) as [Date]
    ,datename(weekday,dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0)))))) as [WeekDayName]
    ,datepart(weekday,dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0)))))) as [WeekDay]
    ,(@@datefirst + datepart(weekday,dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0))))))) % 7 as [MyWeekDay]

    ,datepart(week,dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0)))))) as WeekOfYear
    ,datediff(week
                     ,case when (@@datefirst + datepart(weekday,dateadd(day,0,datediff(day,0,dateadd(year,datediff(year,0,@),0))))) % 7 = 1
                                then dateadd(day,-1,dateadd(day,0,datediff(day,0,dateadd(year,datediff(year,0,@),0))))
                           else dateadd(day,0,datediff(day,0,dateadd(year,datediff(year,0,@),0))) --date 所在年的第一天 即: 一月一号
                      end
                     ,case when (@@datefirst + datepart(weekday,dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0))))))) % 7 = 1
                                then dateadd(day,-1,dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0))))))
                           else dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0)))))
                      end
                    ) + 1 as MyWeekOfYear


    ,datediff(week,dateadd(day,1-day(dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0)))))),dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0)))))),dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0)))))) +1 as WeekOfMonth

    ,datediff(week
                     ,case when (@@datefirst + datepart(weekday,dateadd(month,datediff(month,0,dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0)))))),0))) % 7 = 1
                                then dateadd(month,datediff(month,0,dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0)))))),0) -1
                           else dateadd(month,datediff(month,0,dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0)))))),0)
                      end
                     ,case when (@@datefirst + datepart(weekday,dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0))))))) % 7 = 1
                                then dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0)))))-1
                           else dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0)))))
                      end
                    ) + 1 as MyWeekOfMonth

    ,datepart(dayofyear,dateadd(day,0,datediff(day,0,dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0)))))) as DayOfYear

    from
    (
    select 0 as i
    union all select 1 union all select 2 union all select 3
    union all select 4 union all select 5 union all select 6
    union all select 7 union all select 8 union all select 9
    union all select 10 union all select 11
    ) M
    ,
    (
    select 0 as i
    union all select 1 union all select 2 union all select 3 union all select 4 union all select 5
    union all select 6 union all select 7 union all select 8 union all select 9 union all select 10
    union all select 11 union all select 12 union all select 13 union all select 14
    union all select 15 union all select 16 union all select 17 union all select 18
    union all select 19 union all select 20 union all select 21 union all select 22
    union all select 23 union all select 24 union all select 25 union all select 26
    union all select 27 union all select 28 union all select 29 union all select 30
    ) d

    where datediff(month,dateadd(year,datediff(year,0,@),0),dateadd(day,d.i,dateadd(month,m.i,dateadd(year,datediff(year,0,@),0)))) = m.i
    order by [Date]

  • 相关阅读:
    在IIS中浏览网站时出现:无法打开登录所请求的数据库 "***",登录失败
    Java中的深拷贝和浅拷贝(转载)
    Java的Final和C#的Const,Readonly比较分析(转载)
    C#中的Sealed和J#中的Final比较(转载)
    Java全系列帮助文档下载
    The Willpower Instinct(自控力,意志力)
    瓦片地图的前世今生(转载)
    创建CUDA项目
    CUDA warning C4819的消除
    并行调用
  • 原文地址:https://www.cnblogs.com/Microshaoft/p/2485780.html
Copyright © 2020-2023  润新知