--
日期推算处理总结
DECLARE @DATE DATETIME -- 日期参数
SET @DATE = ' 2007-03-26 '
-- 1:年
-- 指定日期所在该年的第一天
SELECT YearFirstDay = CONVERT ( CHAR ( 5 ), @DATE , 120 ) + ' 1-1 '
-- 指定日期所在该年的最后一天
SELECT YearLastDay = CONVERT ( CHAR ( 5 ), @DATE , 120 ) + ' 12-31 '
-- 2:季度
-- 指定日期所在该季度的第一天〔当前月份减(0或1或2)即所要季度的第一个月,然后再加日(1)〕
SELECT QuarterFirstDay = CONVERT ( DATETIME ,
CONVERT ( CHAR ( 8 ),
DATEADD ( MONTH ,
DATEPART (QUARTER, @DATE ) * 3 - MONTH ( @DATE ) - 2
, @DATE )
, 120 )
+ ' 1 ' )
-- 指定日期所在该季度的最后一天〔当前月份加(0或1或2)即所要季度的最后一个月,然后再加日(31或30)〕
-- (CASE判断法)
SELECT QuarterLastDay = CONVERT ( DATETIME ,
CONVERT ( CHAR ( 8 ),
DATEADD ( MONTH ,
DATEPART (QUARTER, @DATE ) * 3 - MONTH ( @DATE )
, @DATE )
, 120 )
+ CASE WHEN DATEPART (QUARTER, @DATE ) IN ( 1 , 4 ) THEN ' 31 ' ELSE ' 30 ' END )
-- 直接推算法〔下一个季度的第一个月的第一天减日(1)〕
SELECT QuarterLastDay = DATEADD ( DAY , - 1 ,
CONVERT ( CHAR ( 8 ),
DATEADD ( MONTH ,
1 + DATEPART (QUARTER, @DATE ) * 3 - MONTH ( @DATE )
, @DATE )
, 120 )
+ ' 1 ' )
-- 3:月
-- 指定日期所在月份的第一天
SELECT MonthFirstDay = CONVERT ( DATETIME , CONVERT ( CHAR ( 8 ), @DATE , 120 ) + ' 1 ' )
-- 指定日期所在月份的最后一天〔下个月的第一天减日(1)〕
SELECT MonthLastDay = DATEADD ( DAY , - 1 , CONVERT ( CHAR ( 8 ), DATEADD ( MONTH , 1 , @DATE ), 120 ) + ' 1 ' )
-- 4:周
-- 指定日期所在周的任意一天
DECLARE @Number INT -- 周的第几天
SET @Number = 6
SELECT WeekAnyDay = DATEADD ( DAY , @Number - DATEPART (WEEKDAY, @DATE ), @DATE )
-- 5:星期
-- 指定日期所在周的任意星期几
DECLARE @NUM INT -- 星期几
SET @NUM = 4
SELECT WeekDay = DATEADD ( DAY ,
@NUM - ( DATEPART (WEEKDAY, @DATE ) + @@DATEFIRST - 1 ) % 7 , @DATE )
DECLARE @DATE DATETIME -- 日期参数
SET @DATE = ' 2007-03-26 '
-- 1:年
-- 指定日期所在该年的第一天
SELECT YearFirstDay = CONVERT ( CHAR ( 5 ), @DATE , 120 ) + ' 1-1 '
-- 指定日期所在该年的最后一天
SELECT YearLastDay = CONVERT ( CHAR ( 5 ), @DATE , 120 ) + ' 12-31 '
-- 2:季度
-- 指定日期所在该季度的第一天〔当前月份减(0或1或2)即所要季度的第一个月,然后再加日(1)〕
SELECT QuarterFirstDay = CONVERT ( DATETIME ,
CONVERT ( CHAR ( 8 ),
DATEADD ( MONTH ,
DATEPART (QUARTER, @DATE ) * 3 - MONTH ( @DATE ) - 2
, @DATE )
, 120 )
+ ' 1 ' )
-- 指定日期所在该季度的最后一天〔当前月份加(0或1或2)即所要季度的最后一个月,然后再加日(31或30)〕
-- (CASE判断法)
SELECT QuarterLastDay = CONVERT ( DATETIME ,
CONVERT ( CHAR ( 8 ),
DATEADD ( MONTH ,
DATEPART (QUARTER, @DATE ) * 3 - MONTH ( @DATE )
, @DATE )
, 120 )
+ CASE WHEN DATEPART (QUARTER, @DATE ) IN ( 1 , 4 ) THEN ' 31 ' ELSE ' 30 ' END )
-- 直接推算法〔下一个季度的第一个月的第一天减日(1)〕
SELECT QuarterLastDay = DATEADD ( DAY , - 1 ,
CONVERT ( CHAR ( 8 ),
DATEADD ( MONTH ,
1 + DATEPART (QUARTER, @DATE ) * 3 - MONTH ( @DATE )
, @DATE )
, 120 )
+ ' 1 ' )
-- 3:月
-- 指定日期所在月份的第一天
SELECT MonthFirstDay = CONVERT ( DATETIME , CONVERT ( CHAR ( 8 ), @DATE , 120 ) + ' 1 ' )
-- 指定日期所在月份的最后一天〔下个月的第一天减日(1)〕
SELECT MonthLastDay = DATEADD ( DAY , - 1 , CONVERT ( CHAR ( 8 ), DATEADD ( MONTH , 1 , @DATE ), 120 ) + ' 1 ' )
-- 4:周
-- 指定日期所在周的任意一天
DECLARE @Number INT -- 周的第几天
SET @Number = 6
SELECT WeekAnyDay = DATEADD ( DAY , @Number - DATEPART (WEEKDAY, @DATE ), @DATE )
-- 5:星期
-- 指定日期所在周的任意星期几
DECLARE @NUM INT -- 星期几
SET @NUM = 4
SELECT WeekDay = DATEADD ( DAY ,
@NUM - ( DATEPART (WEEKDAY, @DATE ) + @@DATEFIRST - 1 ) % 7 , @DATE )