`

T-SQL 生成一个简易的 公历年历 T-SQL 含日期所在月及年的周次

 
阅读更多

--增加了日期所在月及年的周次!
--星期日要算在"上一周"!(注意 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]

分享到:
评论

相关推荐

    每年第一天为第一周的周次算法

    这段SQL首先找到一年中1月1日所在的周数,然后将目标日期的周数减去这个值,再加1,得到的就是符合题设的周次。 至于标签中的DBA,他们可能需要对大量日期数据进行分析,例如按周统计销售量或用户活动,此时了解和...

    用js jq HTML css实现网页万年历 (有周次统计)

    - 计算每个日期所在的周次,这可能需要对日期进行一些数学运算,如计算日期距离该月第一天的距离,然后除以7取余。 6. **周次统计**: - 设计一个数据结构来存储每周的起始日期和结束日期。 - 当日期跨周时,...

    计算周次(未规定每年第一天是属于第一周)

    例如,在Python的`dateutil`库中,我们可以创建一个`rrule`对象来定义星期的起点,然后使用这个规则来计算日期所在的周次。在Java中,我们可以使用`Calendar`类的`setFirstDayOfWeek`方法来改变一周的起始日。 下面...

    周次算法(动态设置每周第一天)

    周次算法,也被称为日历算法,是一种在计算机科学中用于处理日期和时间问题的方法,特别是在需要根据特定规则计算一年中的周次时。这个概念在许多国家和领域中都有应用,比如教育系统的学期安排、财务报告周期等。在...

    js获取指定标准时间所在年的周次

    vue或者js获取指定标准时间所在年的周次

    excel自动计算周次及周起始时间

    最近在制作一个报表,里面需要计算某日是属于当年的多少周,并且要显示这周的起始日期和截止日期,本以为网上会有很多,可是找来找去,要么是要用WEEKNUM()这函数,需要加分析工具库,通用性不是很强,要么就不是...

    ABAP日期函数(求月末日,第几周,search help 只显示年月) 使用方法实例

    使用 DATE_GET_WEEK 函数可以获取一个日期所在的周数。例如,当前日期是 2022 年 4 月 10 日,则可以使用该函数获取该日期所在的周数。 4. 弹出选择周的对话框 使用 F4_DATE 函数可以弹出一个窗口,显示一个日历,...

    Oracle 获得某日期属于一年中的第几个自然周

    标题“Oracle 获取某日期属于一年中的第几个自然周”指的是在Oracle数据库系统中,通过SQL查询来确定一个特定日期在当年是第几周的问题。在实际业务中,这样的功能可能用于统计、报告或者数据分析,例如,公司可能...

    SQL Server 2005大型数据仓库系统设计经验分享

    4. **T-SQL 分析语句**: - **新增功能**:包括PIVOT, UNPIVOT, RANK 等。 - **意义**:提供了更为强大的数据聚合与排序功能,方便进行复杂的数据分析。 5. **NUMA 支持**: - **介绍**:支持非统一内存访问架构...

    oracle的一些时间操作

    - **计算某一个月内该日期所在的周次**: ```sql SELECT TO_CHAR(SYSDATE, 'WW') - TO_CHAR(TRUNC(SYSDATE, 'MM'), 'WW') + 1 AS "WEEK_OF_MON" FROM DUAL; ``` 通过以上介绍,我们可以看到Oracle数据库提供了...

    mysql 查询本周、上周、本月

    查询上个月的数据同样可以通过比较月份的方式来实现,只需要将当前时间减去一个月的时间差: ```sql SELECT name, submittime FROM enterprise WHERE date_format(submittime, '%Y-%m') = date_format(DATE_SUB...

    九年级数学教学计划含教学进度(周次).pdf

    九年级数学教学计划含教学进度(周次).pdf

    MySQL查询本周上周上个月份

    查询上个月的数据可以使用 `DATE_SUB()` 函数来从当前日期减去一个月的时间跨度,再使用 `DATE_FORMAT()` 函数提取月份信息。SQL 语句如下: ```sql SELECT name, submittime FROM enterprise WHERE DATE_FORMAT...

    2021部编版五年级下册道德与法治教学进度表教学安排表[附周次起止日期].pdf

    2021部编版五年级下册道德与法治教学进度表教学安排表[附周次起止日期].pdf

    数据库-教务管理系统

    教务管理系统是一个典型的信息化应用,主要用于高校或教育机构管理日常的教学活动。在这个系统中,数据库起着核心作用,存储和管理大量的教学数据,如学生信息、课程信息、教师信息、成绩记录等。SQL(Structured ...

    电子校历自动生成系统的设计与实现-刘哲.pdf

    《电子校历自动生成系统的设计与实现》 在高等教育领域,教学管理是一项复杂且重要的任务,其中涉及到大量的数据处理和日程安排。电子校历作为教学计划的重要组成部分,其生成和管理对于提升教学效率和管理水平至关...

    周历显示的文件,可以显示1年内的所有周

    标题中的"周历显示的文件"通常指的是一个Web页面,这个页面能够以周为单位展示日期,如WeekRecordAdmin.aspx。ASP.NET提供ASP.NET Web Forms技术,允许我们创建交互式的网页。WeekRecordAdmin.aspx是一个ASP.NET Web...

    ABAP计算日期的函数

    13. **RP_LAST_DAY_OF_MONTHS** & **FIRST_DAY_IN_PERIOD_GET** & **LAST_DAY_IN_PERIOD_GET**:分别用于获取一个月的最后一天、某一周期的开始和结束日期,对于财务结算、报表统计等功能至关重要。 14. **HR_99S_...

    ASP+SQL学生排课管理系统(源代码+论文).rar

    【ASP+SQL学生排课管理系统】是一个基于ASP技术与SQL Server数据库的学生课程安排系统,它主要用于帮助教育机构或学校高效地进行课程规划和管理。这个系统通常包含以下几个核心功能模块: 1. **用户管理**:系统...

    PHP实现获取某个月份周次信息的方法

    8. 对于月中的周次,通过设置一个基点时间戳(`$t`),然后通过累加周数来找到每一周的开始和结束日期。需要注意的是,这里使用了星期一作为每周的开始,并且通过调整时间戳来得到正确的日期。 9. PHP中的数组使用...

Global site tag (gtag.js) - Google Analytics