SQL SERVER 数据库日期算法总结

DECLARE @Date  DATETIME
SET @Date=GETDATE()
–前一天,给定日期的头天
SELECT DATEADD(DAY,-1,@Date) AS ‘前一天’
–后一致天,给定日期的继同上
SELECT DATEADD(DAY,1,@Date) AS ‘后一天’
GO

–月初,计算给定日期所在月的第一天
–这个匡的技术是预先计算时日期及”1900-01-01″的年华间隔数,然后拿它加至”1900-01-01″上来取得特别的日子
–这个技术可以用来计量很多不等之日期
DECLARE @Date  DATETIME
SET @Date=GETDATE()
SELECT DATEADD(MONTH,DATEDIFF(MONTH,’1900-01-01′,@Date),’1900-01-01′) AS ‘所在月的首先上’
–精简算法,根据SQL
Server的时日代表法能够,’1900-01-01′ 可以用0替替
SELECT DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0) AS ‘所在月的第一天’
–上面两种算法精确到数瞬间均为00:00:00.000
–下面竟法课以保留时转
–思路:用给定日期减去月第一龙及给定日期差之流年
SELECT DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)
GO

–月末,计算给定日期所在月的尾声一天
DECLARE @Date  DATETIME
SET @Date=GETDATE()
–思路:当前月份之生一月1声泪俱下当减1天
SELECT DATEADD(DAY,-1,DATEADD(MONTH,1+DATEDIFF(MONTH,’1900-01-01′,@Date),’1900-01-01′)) AS ‘所在月的最平等上’
SELECT DATEADD(MONTH,1+DATEDIFF(MONTH,’1900-01-01′,@Date),’1900-01-01′)-1
AS ‘所在月的顶平等天’
–1900-01-01 用0代替
SELECT DATEADD(DAY,-1,DATEADD(MONTH,1+DATEDIFF(MONTH,0,@Date),0)) AS ‘所在月的尽平等上’
SELECT DATEADD(MONTH,1+DATEDIFF(MONTH,0,@Date),0)-1
AS ‘所在月的绝平等天’
–思路:与月初计算思路一致
SELECT DATEADD(MONTH,DATEDIFF(MONTH,’1989-12-31′,@Date),’1989-12-31′) AS ‘所在月的极度平等上’
–精简算法,’1989-12-31′ 用-1替
SELECT DATEADD(MONTH,DATEDIFF(MONTH,-1,@Date),-1)
AS ‘所在月的无比平等上’
–保留时转的算法
SELECT DATEADD(DAY,-1,DATEADD(MONTH,1,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)))
GO

–其他月计算
–计算给定日期所在月的上月首先龙
DECLARE @Date  DATETIME
SET @Date=GETDATE()
–当前月率先上减去一个月份
SELECT DATEADD(MONTH,-1,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0)) AS ‘上月先是天’
–简化
SELECT DATEADD(MONTH,DATEDIFF(MONTH,0,@Date)-1,0)
AS ‘上月率先上’
–另一样种时月份第一天算法
SELECT DATEADD(MONTH,-1,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)) ‘上月首先龙’
GO

–计算给定日期所在月的上月最终一上
DECLARE @Date  DATETIME
SET @Date=GETDATE()
–当前月首先龙减去同天
SELECT DATEADD(DAY,-1,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0)) AS ‘上月末一上’
–另一样种时月第一天算法
SELECT DATEADD(DAY,-1,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)) ‘上月最后一龙’
SELECT DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)-1
‘上月最终一上’
–另一样栽算法,不能够就此当下月份之末尾一龙加一个月份,因为眼下月份或者是30上。
–例如 SELECT
DATEADD(MONTH,1,’2010-06-30′)
–结果是2010-07-30而不是2010-07-31,
–这也是月末算法采用下月率先上减1龙计算的原委
–但是如计算月是31上择无夫问题
–例如 SELECT
DATEADD(MONTH,1,’2010-05-31′) –结果是2010-06-30
–因此下算法是是的,-1 表示’1899-12-31
00:00:00.000′– SELECT CONVERT(DATETIME,-1)
SELECT DATEADD(MONTH,DATEDIFF(MONTH,-1,@Date)-1,-1)
–另一样种时月算法
SELECT DATEADD(DAY,-1,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)) ‘上月最终一上’
–简化
SELECT DATEADD(DAY,0-DATEPART(DAY,@Date),@Date) ‘上月最后一龙’
GO

–计算给定日期所在月的下月首先上
DECLARE @Date  DATETIME
SET @Date=GETDATE()
–当前月率先龙加一个月
SELECT DATEADD(MONTH,1,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0)) AS ‘下月先是上’
–简化
SELECT DATEADD(MONTH,DATEDIFF(MONTH,0,@Date)+1,0)
AS ‘下月首先龙’
–另一样栽时月第一上算法
SELECT DATEADD(MONTH,1,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)) ‘下月先是天’
GO

–计算给定日期所在月的下月末一龙
DECLARE @Date  DATETIME
SET @Date=GETDATE()
–当前月先是天加2单月再次减去1天
SELECT DATEADD(DAY,-1,DATEADD(MONTH,2,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0))) AS ‘下月最终一天’
–简化
SELECT DATEADD(DAY,-1,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date)+2,0)) AS ‘下月末一上’
SELECT DATEADD(MONTH,DATEDIFF(MONTH,0,@Date)+2,0)-1
AS ‘下月最后一天’
–另一样种植算法
SELECT DATEADD(MONTH,DATEDIFF(MONTH,-1,@Date)+1,-1)
‘下月最终一天’
–另一样种时月第一天算法
SELECT DATEADD(DAY,-1,DATEADD(MONTH,2,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date))) ‘下月末一龙’
GO

–所在周日的首先上,计算给定日期所于小礼拜的第1天(星期日也第一上)
DECLARE @Date  DATETIME
SET @Date= GETDATE()
–同SQL Server语言版本相关的算法
–思路:当前日子+星期日(每周的第1天)与眼前日子的差的运
–DATEPART(WEEKDAY,DATE)的返回值与@@DATEFIRST相关
SET DATEFIRST 7 —
或者安装为美国英语SET LANGUAGE us_english; (星期日吗率先上)
SELECT DATEADD(WEEKDAY,1-DATEPART(WEEKDAY,@Date),@Date) AS ‘所于星期日的第一上,星期日’
–星期日,与SQL
Server语言版本要@@DATEFIRST无关
–‘1989-12-31′ 是星期,’1989-12-31’
再加上(当前日子以及1989-12-31不比的星期数)个礼拜
SELECT
DATEADD(WEEK,DATEDIFF(WEEK,-1,@Date),-1)
AS ‘所当小礼拜的星期天’
–或者
SELECT
DATEADD(WEEK,DATEDIFF(WEEK,6,@Date),6) AS ‘所当星期的礼拜’
GO

–所在周末的亚龙,计算给定日期所当星期日的第2上(星期日吗率先上)
DECLARE @Date  DATETIME
SET @Date= GETDATE()
–思路:当前日子+星期一(每周的第2龙)与目前日期的例外之气数
–DATEPART(WEEKDAY,DATE)的返回值与@@DATEFIRST相关
SET DATEFIRST 7 —
要安装也美国英语SET LANGUAGE us_english; (星期日为第一天)
SELECT DATEADD(DAY,2-DATEPART(WEEKDAY,@Date),@Date) AS ‘所当小礼拜的亚天,星期一’
–星期一,与SQL
Server语言版本要@@DATEFIRST无关
–‘1900-01-01′ 是星期一,’1900-01-01’
再增长(当前日期和1900-01-01差之星期数)个礼拜
SELECT
DATEADD(WEEK,DATEDIFF(WEEK,0,@Date),0) AS ‘所当小礼拜的周末一’
GO

–上个星期第一龙,计算给定日期所于周日的上一个礼拜(星期日为率先龙)
DECLARE @Date  DATETIME
SET @Date= GETDATE()
–思路:当前日记所于周日的礼拜再次减1完善
–DATEPART(WEEKDAY,DATE)的返回值与@@DATEFIRST相关
SET DATEFIRST 7 —
或设置为美国英语SET LANGUAGE us_english; (星期日呢率先天)
SELECT DATEADD(WEEK,-1,DATEADD(DAY,1-DATEPART(WEEKDAY,@Date),@Date)) AS ‘上个星期第一上,星期日’
–同圆等7天
SELECT DATEADD(DAY,-7,DATEADD(DAY,1-DATEPART(WEEKDAY,@Date),@Date)) AS ‘上个星期第一上,星期日’
–简化
SELECT DATEADD(DAY,-6-DATEPART(WEEKDAY,@Date),@Date) AS ‘上个星期第一龙,星期日’
–上个星期日,与SQL
Server语言版本要@@DATEFIRST无关
SELECT DATEADD(WEEK,-1+DATEDIFF(WEEK,-1,@Date),-1)
AS ‘上个星期日’
–或者
SELECT
DATEADD(WEEK,DATEDIFF(WEEK,6,@Date),-1)
AS ‘上个星期日’
GO

–下个星期第一上,计算给定日期所当星期日的生一个星期(星期日吧率先上)
DECLARE @Date  DATETIME
SET @Date= GETDATE()
–思路:当前日记所当小礼拜的周末再加1周
–DATEPART(WEEKDAY,DATE)的返回值与@@DATEFIRST相关
SET DATEFIRST 7 —
要么设置也美国英语SET LANGUAGE us_english; (星期日也率先上)
SELECT DATEADD(WEEK,1,DATEADD(DAY,1-DATEPART(WEEKDAY,@Date),@Date)) AS ‘下个星期第一龙,星期日’
–同周等7天
SELECT DATEADD(DAY,7,DATEADD(DAY,1-DATEPART(WEEKDAY,@Date),@Date)) AS ‘下个星期第一龙,星期日’
–简化
SELECT DATEADD(DAY,8-DATEPART(WEEKDAY,@Date),@Date) AS ‘下个星期第一天,星期日’
–下个星期日,与SQL
Server语言版本要@@DATEFIRST无关
SELECT DATEADD(WEEK,1+DATEDIFF(WEEK,-1,@Date),-1)
AS ‘下个星期日’
–或者
SELECT
DATEADD(WEEK,DATEDIFF(WEEK,-1,@Date),6) AS ‘下个星期日’
GO

–判断给定日期是星期几
DECLARE @Date  DATETIME
SET @Date= GETDATE()
–DATEPART(WEEKDAY,DATE)的返回值与@@DATEFIRST相关
SET DATEFIRST 7 —
要么安装也美国英语SET LANGUAGE us_english; (星期日吧第一上)
SELECT DATEPART(WEEKDAY,@Date) –返回值
1-星期日,2-星期一,3-星期二……7-星期六
–上面算法和SQL 语言版要 @@DATEFIRST
相关
–下面算法和SQL
Server语言版本要@@DATEFIRST无关
SELECT DATENAME(WEEKDAY,@Date) ‘星期’
GO

–年计算
DECLARE @Date  DATETIME
SET @Date=GETDATE()
–年新,计算给定日期所在年的率先天
SELECT DATEADD(YEAR,DATEDIFF(YEAR,0,@Date),0) AS ‘所在年的首先上’
–年末,计算给定日期所在年的终极一上
SELECT DATEADD(YEAR,DATEDIFF(YEAR,-1,@Date),-1)
AS ‘所在年的末尾一龙’
–上一年新春,计算给定日期所在年的上一年之率先龙
SELECT DATEADD(YEAR,DATEDIFF(YEAR,-0,@Date)-1,0)
AS ‘所在年的上一年底首先上’
–上一年年最后,计算给定日期所在年的上一年底末段一上
SELECT DATEADD(YEAR,DATEDIFF(YEAR,0,@Date),-1)
AS ‘所在年的上一年之末梢一天’
–下同样年开春,计算给定日期所在年的生一致年之第一上
SELECT DATEADD(YEAR,1+DATEDIFF(YEAR,0,@Date),0) AS ‘所在年的生一样年之第一天’
–下同样年年末,计算给定日期所在年的产一致年的最后一上
SELECT DATEADD(YEAR,1+DATEDIFF(YEAR,-1,@Date),-1)
AS ‘所在年的生一致年的终极一上’
GO

–季度计算
DECLARE @Date  DATETIME
SET @Date=GETDATE()
–季度初,计算给定日期所于季度的率先龙
SELECT
DATEADD(QUARTER,DATEDIFF(QUARTER,0,@Date),0) AS ‘当前季度的第一天’
–季度末,计算给定日期所当季度的末段一上
SELECT DATEADD(QUARTER,1+DATEDIFF(QUARTER,0,@Date),-1)
AS ‘当前季度的末梢一天’
–上个季度初
SELECT
DATEADD(QUARTER,DATEDIFF(QUARTER,0,@Date)-1,0)
AS ‘当前季度的上个季度初’
–上个季度末
SELECT
DATEADD(QUARTER,DATEDIFF(QUARTER,0,@Date),-1)
AS ‘当前季度的上个季度末’
–下个季度初
SELECT DATEADD(QUARTER,1+DATEDIFF(QUARTER,0,@Date),0) AS ‘当前季度的下个季度初’
–下个季度末
SELECT DATEADD(QUARTER,2+DATEDIFF(QUARTER,0,@Date),-1)
AS ‘当前季度的下个季度末’
GO
–计算给定日期所在月的天数
DECLARE @Date DATETIME; 
SET @Date = GETDATE()
–本月度第一上及下月度第一天所例外之气数
SELECT DATEDIFF(DAY,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0),DATEADD(MONTH,1+DATEDIFF(MONTH,0,@Date),0))
–因变量简化
SELECT @Date = DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0)
–本月度第一天
SELECT DATEDIFF(DAY,@Date,DATEADD(MONTH,1,@Date))
–另一样种思路:给定月最终一天的日子,记否本月数
SELECT DAY(DATEADD(MONTH,DATEDIFF(MONTH,-1,@Date),-1))
GO
–计算给定日期所当季度的命运
DECLARE @Date DATETIME; SET @Date = GETDATE()
–本季度第一龙同生季度第一天所不同之运气
SELECT DATEDIFF(DAY,DATEADD(QUARTER,DATEDIFF(QUARTER,0,@Date),0),DATEADD(QUARTER,1+DATEDIFF(QUARTER,0,@Date),0))
–因变量简化
SELECT @Date = DATEADD(QUARTER,DATEDIFF(QUARTER,0,@Date),0)
–本季度第一天
SELECT DATEDIFF(DAY,@Date,DATEADD(QUARTER,1,@Date))
GO
–计算给定日期所于年之天数
DECLARE @Date DATETIME; SET @Date = GETDATE()
–本年度第一天及生年度第一龙所不同的命运
SELECT DATEDIFF(DAY,DATEADD(YEAR,DATEDIFF(YEAR,0,@Date),0),DATEADD(YEAR,1+DATEDIFF(YEAR,0,@Date),0))
–因变量简化
SELECT @Date = DATEADD(YEAR,DATEDIFF(YEAR,0,@Date),0)
–本年度第一上
SELECT DATEDIFF(DAY,@Date,DATEADD(YEAR,1,@Date))
GO
–判断给定日期所在年是否闰年
–根据全年总天数判断
DECLARE @Date DATETIME
SET @Date = GETDATE()
SELECT
CASE DATEDIFF(DAY,DATEADD(YEAR,DATEDIFF(YEAR,0,@Date),0),DATEADD(YEAR,1+DATEDIFF(YEAR,0,@Date),0))
WHEN 365 THEN ‘平年’
ELSE ‘闰年’
END
–根据二月运判断
–给日期的上一年末一龙加2个月,即为当时2月末一上
SELECT
CASE DAY(DATEADD(MONTH,2,DATEADD(YEAR,DATEDIFF(YEAR,0,@Date),-1)))
WHEN 28 THEN ‘平年’
ELSE ‘闰年’
END
GO
–计算给定日期是那时底第几天
DECLARE @Date DATETIME; SET @Date = GETDATE()
SELECT
DATEPART(DAYOFYEAR,@Date)
[DayOfYear]
SELECT
DATENAME(DAYOFYEAR,@Date)
[DayOfYear]
–另一样种思路:当前日期及去年最终一上差之天数
SELECT DATEDIFF(DAY,DATEADD(YEAR,DATEDIFF(YEAR,0,@Date),-1),@Date) [DayOfYear]
GO –计算给定日期是当年底第几到家
DECLARE @Date DATETIME
SET @Date = GETDATE()
SELECT DATEPART(WEEK,@Date) [WeekOfYear]–返回int型
SELECT DATENAME(WEEK,@Date) [WeekOfYear]–返回varchar型
GO
–计算给定日期是那时候之第几月份
DECLARE @Date DATETIME
SET @Date = GETDATE() SELECT DATEPART(MONTH,@Date) [MonthOfYear]–返回int型
SELECT DATENAME(MONTH,@Date) [MonthOfYear] –返回varchar型
SELECT MONTH(@Date) [MonthOfYear] –返回int型
GO
–计算给定日期是当时的第几季度
DECLARE @Date DATETIME
SET @Date = GETDATE() SELECT DATEPART(QUARTER,@Date) [QuarterOfYear] –返回int型
SELECT DATENAME(QUARTER,@Date) [QuarterOfYear] –返回varchar型 
GO 
–计算给定日期是当月之第几周 
DECLARE @Date DATETIME
SET @Date = GETDATE() 
–思路,给定日期是当年之第几周-给定日期所在月第一龙是那时候底第几周 
SELECT DATEPART(WEEK,@Date)-DATEPART(WEEK,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0))+1
[WeekOfMonth] 
SELECT DATEPART(WEEK,@Date)-DATEPART(WEEK,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date))+1
[WeekOfMonth]
GO 
–计算给定日期所在月的率先单星期一凡啦天 
DECLARE @Date DATETIME
SET @Date = GETDATE() 
–思路,1900-01-01(星期一)加上(给定日志所在月的月度6哀号与1900-01-01不比的周数)个完美
–为什么不挑7哀号?如果是7声泪俱下,那么7吓巧是星期天的讲话,第一单周一即令会算到8号。
–为什么非选择5号?如果5哀号是星期六,那么周一便飞至上月矣。小于5号与之道理同样。
SELECT
DATEADD(WEEK,DATEDIFF(WEEK,0,DATEADD(DAY,6-DATEPART(DAY,@Date),@Date)),0) ‘所在月的第一独星期一’ 
SELECT
DATEADD(WEEK,DATEDIFF(WEEK,0,DATEADD(DAY,6-DATEPART(DAY,@Date),@Date)),7) ‘所在月的第二单周末一’ 
SELECT
DATEADD(WEEK,DATEDIFF(WEEK,0,DATEADD(DAY,6-DATEPART(DAY,@Date),@Date)),1) ‘所在月的首先独星期二’ 
SELECT
DATEADD(WEEK,DATEDIFF(WEEK,0,DATEADD(DAY,6-DATEPART(DAY,@Date),@Date)),8) ‘所在月的第二只周末二’
GO

相关文章