sql日期计算汇总

非技术,当也很精彩,点击进入

01.DECLARE @Date  DATETIME   
02.SET @Date=GETDATE()   
03.--前一天,给定日期的前一天   
04.SELECT DATEADD(DAY,-1,@Date) AS '前一天'  
05.--后一天,给定日期的后一天    
06.SELECT DATEADD(DAY,1,@Date) AS '后一天'  

10.--月初,计算给定日期所在月的第一天   
11.--这个计算的技巧是先计算当前日期到“1900-01-01”的时间间隔数,然后把它加到“1900-01-01”上来获得特殊的日期,这个技巧可以用---来计算很多不同的日期。   
12.DECLARE @Date  DATETIME   
13.SET @Date=GETDATE()   
14.SELECT DATEADD(MONTH,DATEDIFF(MONTH,'1900-01-01',@Date),'1900-01-01') AS '所在月的第一天'  
15.--精简算法,根据SQL Server的时间表示方式可知,'1900-01-01' 可以用0代替   
16.SELECT DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0) AS '所在月的第一天'  
17.--上面两种算法精确到天 时分秒均为00:00:00.000   
18.--下面算法课以保留时分秒   
19.--思路:用给定日期减去月第一天与给定日期差的天数   
20.SELECT DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)   
21.GO   
22.  
23.--月末,计算给定日期所在月的最后一天   
24.DECLARE @Date  DATETIME   
25.SET @Date=GETDATE()   
26.--思路:当前月的下一月1号在减1天   
27.SELECT DATEADD(DAY,-1,DATEADD(MONTH,1+DATEDIFF(MONTH,'1900-01-01',@Date),'1900-01-01')) AS '所在月的最一天'  
28.SELECT DATEADD(MONTH,1+DATEDIFF(MONTH,'1900-01-01',@Date),'1900-01-01')-1 AS '所在月的最一天'  
29.--1900-01-01 用0代替   
30.SELECT DATEADD(DAY,-1,DATEADD(MONTH,1+DATEDIFF(MONTH,0,@Date),0)) AS '所在月的最一天'  
31.SELECT DATEADD(MONTH,1+DATEDIFF(MONTH,0,@Date),0)-1 AS '所在月的最一天'  
32.--思路:与月初计算思路相同   
33.SELECT DATEADD(MONTH,DATEDIFF(MONTH,'1989-12-31',@Date),'1989-12-31') AS '所在月的最一天'  
34.--精简算法,'1989-12-31' 用-1代替   
35.SELECT DATEADD(MONTH,DATEDIFF(MONTH,-1,@Date),-1) AS '所在月的最一天'  
36.--保留时分秒的算法   
37.SELECT DATEADD(DAY,-1,DATEADD(MONTH,1,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)))   
38.GO   
39.  
40.--其他月计算   
41.  
42.--计算给定日期所在月的上月第一天   
43.DECLARE @Date  DATETIME   
44.SET @Date=GETDATE()   
45.--当前月第一天减去一个月   
46.SELECT DATEADD(MONTH,-1,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0)) AS '上月第一天'  
47.--简化   
48.SELECT DATEADD(MONTH,DATEDIFF(MONTH,0,@Date)-1,0) AS '上月第一天'  
49.--另一种当前月第一天算法   
50.SELECT DATEADD(MONTH,-1,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)) '上月第一天'  
51.GO   
52.  
53.--计算给定日期所在月的上月最后一天   
54.DECLARE @Date  DATETIME   
55.SET @Date=GETDATE()   
56.--当前月第一天减去一天   
57.SELECT DATEADD(DAY,-1,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0)) AS '上月最后一天'  
58.--另一种当前月第一天算法   
59.SELECT DATEADD(DAY,-1,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)) '上月最后一天'  
60.SELECT DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)-1 '上月最后一天'  
61.--另一种算法,不能用当前月的最后一天加一个月,因为当前月可能是30天。   
62.--例如 SELECT DATEADD(MONTH,1,'2010-06-30') --结果是2010-07-30而不是2010-07-31,   
63.--这也是月末算法采用下月第一天减1天计算的原因   
64.--但是如果计算月是31天择无此问题   
65.--例如 SELECT DATEADD(MONTH,1,'2010-05-31') --结果是2010-06-30   
66.--因此下面算法是正确的,-1 表示'1899-12-31 00:00:00.000'-- SELECT CONVERT(DATETIME,-1)    
67.SELECT DATEADD(MONTH,DATEDIFF(MONTH,-1,@Date)-1,-1)   
68.--另一种当前月算法   
69.SELECT DATEADD(DAY,-1,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)) '上月最后一天'  
70.--简化   
71.SELECT DATEADD(DAY,0-DATEPART(DAY,@Date),@Date) '上月最后一天'  
72.GO   
73.  
74.--计算给定日期所在月的下月第一天   
75.DECLARE @Date  DATETIME   
76.SET @Date=GETDATE()   
77.--当前月第一天加一个月   
78.SELECT DATEADD(MONTH,1,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0)) AS '下月第一天'  
79.--简化   
80.SELECT DATEADD(MONTH,DATEDIFF(MONTH,0,@Date)+1,0) AS '下月第一天'  
81.--另一种当前月第一天算法   
82.SELECT DATEADD(MONTH,1,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)) '下月第一天'  
83.GO   
84.  
85.--计算给定日期所在月的下月最后一天   
86.DECLARE @Date  DATETIME   
87.SET @Date=GETDATE()   
88.--当前月第一天加2个月再减去1天   
89.SELECT DATEADD(DAY,-1,DATEADD(MONTH,2,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0))) AS '下月最后一天'  
90.--简化   
91.SELECT DATEADD(DAY,-1,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date)+2,0)) AS '下月最后一天'  
92.SELECT DATEADD(MONTH,DATEDIFF(MONTH,0,@Date)+2,0)-1 AS '下月最后一天'  
93.--另一种算法   
94.SELECT DATEADD(MONTH,DATEDIFF(MONTH,-1,@Date)+1,-1) '下月最后一天'  
95.--另一种当前月第一天算法   
96.SELECT DATEADD(DAY,-1,DATEADD(MONTH,2,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date))) '下月最后一天'  
97.GO   
98.  
99.--所在星期的第一天,计算给定日期所在星期的第1天(星期日为第一天)    
100.DECLARE @Date  DATETIME   
101.SET @Date= GETDATE()   
102.--与SQL Server语言版本相关的算法   
103.--思路:当前日期+星期日(每周的第1天)与当前日期的差的天数   
104.--DATEPART(WEEKDAY,DATE)的返回值与@@DATEFIRST相关   
105.SET DATEFIRST 7 -- 或者设置为美国英语SET LANGUAGE us_english; (星期日为第一天)   
106.SELECT DATEADD(WEEKDAY,1-DATEPART(WEEKDAY,@Date),@Date) AS '所在星期的第一天,星期日'  
107.--星期日,与SQL Server语言版本或@@DATEFIRST无关   
108.--'1989-12-31' 是星期日,'1989-12-31' 再加上(当前日期与1989-12-31差的星期数)个星期   
109.SELECT DATEADD(WEEK,DATEDIFF(WEEK,-1,@Date),-1) AS '所在星期的星期日'  
110.--或者   
111.SELECT DATEADD(WEEK,DATEDIFF(WEEK,6,@Date),6) AS '所在星期的星期日'  
112.GO   
113.  
114.  
115.--所在星期的第二天,计算给定日期所在星期的第2天(星期日为第一天)   
116.DECLARE @Date  DATETIME   
117.SET @Date= GETDATE()   
118.--思路:当前日期+星期一(每周的第2天)与当前日期的差的天数   
119.--DATEPART(WEEKDAY,DATE)的返回值与@@DATEFIRST相关   
120.SET DATEFIRST 7 -- 或者设置为美国英语SET LANGUAGE us_english; (星期日为第一天)   
121.SELECT DATEADD(DAY,2-DATEPART(WEEKDAY,@Date),@Date) AS '所在星期的第二天,星期一'  
122.--星期一,与SQL Server语言版本或@@DATEFIRST无关   
123.--'1900-01-01' 是星期一,'1900-01-01' 再加上(当前日期与1900-01-01差的星期数)个星期   
124.SELECT DATEADD(WEEK,DATEDIFF(WEEK,0,@Date),0) AS '所在星期的星期一'  
125.GO   
126.  
127.--上个星期第一天,计算给定日期所在星期的上一个星期日(星期日为第一天)   
128.DECLARE @Date  DATETIME   
129.SET @Date= GETDATE()   
130.--思路:当前日志所在星期的星期日再减1周   
131.--DATEPART(WEEKDAY,DATE)的返回值与@@DATEFIRST相关   
132.SET DATEFIRST 7 -- 或者设置为美国英语SET LANGUAGE us_english; (星期日为第一天)   
133.SELECT DATEADD(WEEK,-1,DATEADD(DAY,1-DATEPART(WEEKDAY,@Date),@Date)) AS '上个星期第一天,星期日'  
134.--一周等于7天   
135.SELECT DATEADD(DAY,-7,DATEADD(DAY,1-DATEPART(WEEKDAY,@Date),@Date)) AS '上个星期第一天,星期日'  
136.--简化   
137.SELECT DATEADD(DAY,-6-DATEPART(WEEKDAY,@Date),@Date) AS '上个星期第一天,星期日'  
138.--上个星期日,与SQL Server语言版本或@@DATEFIRST无关   
139.SELECT DATEADD(WEEK,-1+DATEDIFF(WEEK,-1,@Date),-1) AS '上个星期日'  
140.--或者   
141.SELECT DATEADD(WEEK,DATEDIFF(WEEK,6,@Date),-1) AS '上个星期日'  
142.GO   
143.  
144.  
145.--下个星期第一天,计算给定日期所在星期的下一个星期日(星期日为第一天)   
146.DECLARE @Date  DATETIME   
147.SET @Date= GETDATE()   
148.--思路:当前日志所在星期的星期日再加1周   
149.--DATEPART(WEEKDAY,DATE)的返回值与@@DATEFIRST相关   
150.SET DATEFIRST 7 -- 或者设置为美国英语SET LANGUAGE us_english; (星期日为第一天)   
151.SELECT DATEADD(WEEK,1,DATEADD(DAY,1-DATEPART(WEEKDAY,@Date),@Date)) AS '下个星期第一天,星期日'  
152.--一周等于7天   
153.SELECT DATEADD(DAY,7,DATEADD(DAY,1-DATEPART(WEEKDAY,@Date),@Date)) AS '下个星期第一天,星期日'  
154.--简化   
155.SELECT DATEADD(DAY,8-DATEPART(WEEKDAY,@Date),@Date) AS '下个星期第一天,星期日'  
156.--下个星期日,与SQL Server语言版本或@@DATEFIRST无关   
157.SELECT DATEADD(WEEK,1+DATEDIFF(WEEK,-1,@Date),-1) AS '下个星期日'  
158.--或者   
159.SELECT DATEADD(WEEK,DATEDIFF(WEEK,-1,@Date),6) AS '下个星期日'  
160.GO   
161.  
162.--判断给定日期是星期几   
163.DECLARE @Date  DATETIME   
164.SET @Date= GETDATE()   
165.--DATEPART(WEEKDAY,DATE)的返回值与@@DATEFIRST相关   
166.SET DATEFIRST 7 -- 或者设置为美国英语SET LANGUAGE us_english; (星期日为第一天)   
167.SELECT DATEPART(WEEKDAY,@Date) --返回值 1-星期日,2-星期一,3-星期二......7-星期六   
168.--上面算法与SQL 语言版本或 @@DATEFIRST 相关   
169.--下面算法与SQL Server语言版本或@@DATEFIRST无关   
170.SELECT DATENAME(WEEKDAY,@Date) '星期'    
171.GO   
172.  
173.  
174.--年度计算   
175.DECLARE @Date  DATETIME   
176.SET @Date=GETDATE()   
177.--年初,计算给定日期所在年的第一天   
178.SELECT DATEADD(YEAR,DATEDIFF(YEAR,0,@Date),0) AS '所在年的第一天'  
179.--年末,计算给定日期所在年的最后一天   
180.SELECT DATEADD(YEAR,DATEDIFF(YEAR,-1,@Date),-1) AS '所在年的最后一天'  
181.--上一年年初,计算给定日期所在年的上一年的第一天   
182.SELECT DATEADD(YEAR,DATEDIFF(YEAR,-0,@Date)-1,0) AS '所在年的上一年的第一天'  
183.--上一年年末,计算给定日期所在年的上一年的最后一天   
184.SELECT DATEADD(YEAR,DATEDIFF(YEAR,0,@Date),-1) AS '所在年的上一年的最后一天'  
185.--下一年年初,计算给定日期所在年的下一年的第一天   
186.SELECT DATEADD(YEAR,1+DATEDIFF(YEAR,0,@Date),0) AS '所在年的下一年的第一天'  
187.--下一年年末,计算给定日期所在年的下一年的最后一天   
188.SELECT DATEADD(YEAR,1+DATEDIFF(YEAR,-1,@Date),-1) AS '所在年的下一年的最后一天'  
189.GO   
190.  
191.--季度计算   
192.DECLARE @Date  DATETIME   
193.SET @Date=GETDATE()   
194.--季度初,计算给定日期所在季度的第一天   
195.SELECT DATEADD(QUARTER,DATEDIFF(QUARTER,0,@Date),0) AS '当前季度的第一天'  
196.--季度末,计算给定日期所在季度的最后一天   
197.SELECT DATEADD(QUARTER,1+DATEDIFF(QUARTER,0,@Date),-1) AS '当前季度的最后一天'  
198.--上个季度初   
199.SELECT DATEADD(QUARTER,DATEDIFF(QUARTER,0,@Date)-1,0) AS '当前季度的上个季度初'  
200.--上个季度末   
201.SELECT DATEADD(QUARTER,DATEDIFF(QUARTER,0,@Date),-1) AS '当前季度的上个季度末'  
202.--下个季度初   
203.SELECT DATEADD(QUARTER,1+DATEDIFF(QUARTER,0,@Date),0) AS '当前季度的下个季度初'  
204.--下个季度末   
205.SELECT DATEADD(QUARTER,2+DATEDIFF(QUARTER,0,@Date),-1) AS '当前季度的下个季度末'  
206.GO  
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

 

view plaincopy to clipboardprint?
01.--计算给定日期所在月的天数   
02.DECLARE @Date DATETIME;   
03.SET @Date = GETDATE()   
04.--本月度第一天与下月度第一天所差的天数   
05.SELECT DATEDIFF(DAY,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0),DATEADD(MONTH,1+DATEDIFF(MONTH,0,@Date),0))   
06.--借助变量简化   
07.SELECT @Date = DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0) --本月度第一天   
08.SELECT DATEDIFF(DAY,@Date,DATEADD(MONTH,1,@Date))   
09.--另一种思路:给定月最后一天的日期,记为本月天数   
10.SELECT DAY(DATEADD(MONTH,DATEDIFF(MONTH,-1,@Date),-1))   
11.GO   
12.  
13.--计算给定日期所在季度的天数   
14.DECLARE @Date DATETIME;   
15.SET @Date = GETDATE()   
16.--本季度第一天与下季度第一天所差的天数   
17.SELECT DATEDIFF(DAY,DATEADD(QUARTER,DATEDIFF(QUARTER,0,@Date),0),DATEADD(QUARTER,1+DATEDIFF(QUARTER,0,@Date),0))   
18.--借助变量简化   
19.SELECT @Date = DATEADD(QUARTER,DATEDIFF(QUARTER,0,@Date),0) --本季度第一天   
20.SELECT DATEDIFF(DAY,@Date,DATEADD(QUARTER,1,@Date))   
21.GO   
22.  
23.--计算给定日期所在年度的天数   
24.DECLARE @Date DATETIME;   
25.SET @Date = GETDATE()   
26.--本年度第一天与下年度第一天所差的天数   
27.SELECT DATEDIFF(DAY,DATEADD(YEAR,DATEDIFF(YEAR,0,@Date),0),DATEADD(YEAR,1+DATEDIFF(YEAR,0,@Date),0))   
28.--借助变量简化   
29.SELECT @Date = DATEADD(YEAR,DATEDIFF(YEAR,0,@Date),0) --本年度第一天   
30.SELECT DATEDIFF(DAY,@Date,DATEADD(YEAR,1,@Date))   
31.GO   
32.  
33.--判断给定日期所在年是否闰年   
34.--根据全年总天数判断   
35.DECLARE @Date DATETIME;   
36.SET @Date = GETDATE()   
37.SELECT CASE DATEDIFF(DAY,DATEADD(YEAR,DATEDIFF(YEAR,0,@Date),0),DATEADD(YEAR,1+DATEDIFF(YEAR,0,@Date),0))    
38.  WHEN 365 THEN '平年' ELSE '闰年' END    
39.--根据二月天数判断   
40.--给日期的上一年最后一天加2个月,即为当年2月最后一天   
41.SELECT CASE DAY(DATEADD(MONTH,2,DATEADD(YEAR,DATEDIFF(YEAR,0,@Date),-1))) WHEN 28 THEN '平年' ELSE '闰年' END    
42.GO   
43.  
44.--计算给定日期是当年的第几天   
45.DECLARE @Date DATETIME;   
46.SET @Date = GETDATE()   
47.SELECT DATEPART(DAYOFYEAR,@Date) [DayOfYear];   
48.SELECT DATENAME(DAYOFYEAR,@Date)  [DayOfYear];   
49.--另一种思路:当前日期与上年最后一天差的天数   
50.SELECT DATEDIFF(DAY,DATEADD(YEAR,DATEDIFF(YEAR,0,@Date),-1),@Date)[DayOfYear]   
51.GO   
52.  
53.--计算给定日期是当年的第几周   
54.DECLARE @Date DATETIME;   
55.SET @Date = GETDATE()   
56.SELECT DATEPART(WEEK,@Date) [WeekOfYear]; --返回int型   
57.SELECT DATENAME(WEEK,@Date) [WeekOfYear]; --返回varchar型   
58.GO   
59.  
60.--计算给定日期是当年的第几月   
61.DECLARE @Date DATETIME;   
62.SET @Date = GETDATE()   
63.SELECT DATEPART(MONTH,@Date) [MonthOfYear]; --返回int型   
64.SELECT DATENAME(MONTH,@Date) [MonthOfYear]; --返回varchar型   
65.SELECT MONTH(@Date) [MonthOfYear];--返回int型   
66.GO   
67.  
68.--计算给定日期是当年的第几季度   
69.DECLARE @Date DATETIME;   
70.SET @Date = GETDATE()   
71.SELECT DATEPART(QUARTER,@Date) [QuarterOfYear]; --返回int型   
72.SELECT DATENAME(QUARTER,@Date) [QuarterOfYear]; --返回varchar型   
73.GO   
74.  
75.--计算给定日期是当月的第几周   
76.DECLARE @Date DATETIME;   
77.SET @Date = GETDATE()   
78.--思路,给定日期是当年的第几周-给定日期所在月第一天是当年的第几周   
79.SELECT DATEPART(WEEK,@Date)-DATEPART(WEEK,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0))+1 [WeekOfMonth]   
80.SELECT DATEPART(WEEK,@Date)-DATEPART(WEEK,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date))+1 [WeekOfMonth]   
81.GO   
82.  
83.--计算给定日期所在月的第一个星期一是哪天   
84.DECLARE @Date DATETIME;   
85.SET @Date = GETDATE()   
86.--思路,1900-01-01(星期一)加上(给定日志所在月的月6号与1900-01-01差的周数)个周   
87.--为什么不选7号?如果是7号,那么7好恰好是星期日的话,第一个周一就会算到8号。   
88.--为什么不选5号?如果5号是星期六,那么周一就跑到上月了。小于5号与这个道理一样。   
89.SELECT DATEADD(WEEK,DATEDIFF(WEEK,0,DATEADD(DAY,6-DATEPART(DAY,@Date),@Date)),0) '所在月的第一个星期一'  
90.SELECT DATEADD(WEEK,DATEDIFF(WEEK,0,DATEADD(DAY,6-DATEPART(DAY,@Date),@Date)),7) '所在月的第二个星期一'  
91.SELECT DATEADD(WEEK,DATEDIFF(WEEK,0,DATEADD(DAY,6-DATEPART(DAY,@Date),@Date)),1) '所在月的第一个星期二'  
92.SELECT DATEADD(WEEK,DATEDIFF(WEEK,0,DATEADD(DAY,6-DATEPART(DAY,@Date),@Date)),8) '所在月的第二个星期二'  

你可能感兴趣的:(sql)