日期年月日处理函数文档格式.docx
《日期年月日处理函数文档格式.docx》由会员分享,可在线阅读,更多相关《日期年月日处理函数文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
29.SELECTDATEADD(Day,-1,CONVERT(char(8),DATEADD(Month,1+DATEPART(Quarter,getdate())*3-Month(getdate()),getdate()),120)+'
1'
)
30.--季度的最后一天(CASE判断法)
31.selectDATEADD(Month,DATEPART(Quarter,getdate())*3-Month(getdate()),getdate())
32.
33.--本月第一个星期一
34.SELECTDATEADD(wk,DATEDIFF(wk,'
'
DATEADD(dd,6-DAY(getdate()),getdate())),'
35.--去年最后一天
36.SELECTdateadd(ms,-3,DATEADD(yy,DATEDIFF(yy,0,getdate()),0))
37.--今年第一天
38.SELECTDATEADD(yy,DATEDIFF(yy,0,getdate()),0)
39.--今年最后一天
40.SELECTdateadd(ms,-3,DATEADD(yy,DATEDIFF(yy,0,getdate())+1,0))
41.
42.--指定日期所在周的任意一天
43.SELECTDATEADD(Day,@number-DATEPART(Weekday,@dt),@dt)--5.指定日期所在周的任意星期几
44.--A.星期天做为一周的第1天
45.SELECTDATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-1)%7,@dt)
46.--B.星期一做为一周的第1天
47.SELECTDATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-2)%7-1,@dt)
48.---周内的第几日
49.selectdatepart(weekday,getdate())as周内的第几日
50.--年内的第几周
51.selectdatepart(week,getdate())as年内的第几周
52.--年内的第几季
53.selectdatepart(quarter,getdate())as年内的第几季
54.
55.
56.--判断某天是当月的第几周的sql函数
57.CREATEFUNCTIONWeekOfMonth(@daydatetime)
58.RETURNSint
59.AS
60.begin
61.
62.----declare@daydatetime
63.declare@numint
64.declare@Startdatetime
65.declare@ddint
66.declare@dayofweekchar(8)
67.declare@dayofweek_numchar(8)
68.declare@startWeekDaysint
69.---set@day='
2009-07-05'
70.ifdatepart(dd,@day)=1
71.return1
72.else
73.set@Start=(SELECTDATEADD(mm,DATEDIFF(mm,0,@day),0))--一个月第一天的
74.set@dayofweek=(datename(weekday,@Start))---得到本月第一天是周几
75.set@dayofweek_num=(select(case@dayofweekwhen'
星期一'
then2
76.when'
星期二'
then3
77.when'
星期三'
then4
78.when'
星期四'
then5
79.when'
星期五'
then6
80.when'
星期六'
then7
81.when'
星期日'
then1
82.end))
83.set@dayofweek_num=7-@dayofweek_num+1---得到本月的第一周一共有几天
84.---print@dayofweek_num
85.set@dd=datepart(dd,@day)----得到今天是这个月的第几天
86.--print@dd
87.if@dd<
=@dayofweek_num--小于前一周的天数
88.return1
89.else
90.set@dd=@dd-@dayofweek_num
91.if@dd%7=0
92.begin
93.set@num=@dd/7
94.return@num+1
95.
96.end
97.else--if@dd%7<
>
0
98.
99.set@num=@dd/7
100.set@num=@num+1+1
101.return@num
102.end
103.
104.--常用日期的视图
105.SELECTCONVERT(VARCHAR(10),GETDATE(),120)AStoday,REPLACE(CONVERT(varchar(8),GETDATE(),108),'
:
'
)AStime,
106.REPLACE(REPLACE(REPLACE(CONVERT(varchar,GETDATE(),120),'
),'
'
)ASall_date,CONVERT(varchar(12),GETDATE(),112)ASdate,
107.YEAR(GETDATE())ASyear,MONTH(GETDATE())ASmonth,DAY(GETDATE())ASday,CONVERT(varchar(8),DATEADD(d,-1,GETDATE()),112)
108.ASyestaday,CONVERT(varchar(8),DATEADD(d,1,GETDATE()),112)AStomorrow
109.FROM
110.
111./*
112.T-SQL:
17个与日期时间相关的自定义函数(UDF),周日作为周的最后一天,均不受@@DateFirst、语言版本影响
113.提示:
114.(@@Datefirst+datepart(weekday,@Date))%7判断周几是最保险的!
与@@DateFirst
无关,与语言版本无关
115.@@DateFirst可能会导致datepart(weekday,@Date)不一样!
116.无论@@DateFirst等于几,无论是什么语言版本的SQLServer下面永远恒成立!
117.(@@Datefirst+datepart(weekday,@Date))%7:
2、3、4、5、6、0、1分别代表周一到周日
118.--*/
119.
120.createfunctionudf_GetAge(@StartDatedatetime,@EndDatedatetime)
121.returnsinteger
122.--返回精确年龄selectdbo.udf_GetAge('
1949-10-01'
getdate())
123.begin
124.returndatediff(year,@StartDate,@EndDate)
125.-casewhendatediff(day,dateadd(year,datediff(year,@StartDate,@EndDate),@StartDate),@EndDate)>
=0
126.then0
127.else
128.1
129.end
130.end
131.
132.go
133.
134.createfunctionudf_DaysOfYearByDate(@Datedatetime)
135.returnsinteger
136.--返回年的天数可判断平(365)、润(366)年
137.begin
138.returndatediff(day,dateadd(year,datediff(year,0,@Date),0),dateadd(year,datediff(year,0,@Date)+1,0))
139.end
140.
141.go
142.
143.createfunctionudf_DaysOfYear(@Yearinteger)
144.returnsinteger
145.--返回年的天数可判断平(365)、润(366)年
146.begin
147.returndatediff(day,dateadd(year,@year-year(0),0),dateadd(year,@year-year(0)+1,0))
148.end
149.
150.go
151.
152.createfunctionudf_HalfDay(@Datedatetime)
153.returnsdatetime
154.--返回@Date是上午返回@Date的零点,@Date是下午返回@Date的十二点
155.begin
156.returncasewhendatepart(hour,@Date)<
12
157.thendateadd(day,datediff(day,0,@Date),0)--上午归到零点
158.else
159.dateadd(hour,12,dateadd(day,datediff(day,0,@Date),0))--下午归到十二点
160.end
161.end
162.
163.go
164.
165.createfunctionudf_WeekDiff(@StartDatedatetime,@EndDatedatetime)
166.returnsinteger
167.--返回[@StartDate,@EndDate]之间周数周日是当周的最后一天
168.begin
169.returndatediff(week,@StartDate,@EndDate)--+1
170.+casewhen(@@Datefirst+datepart(weekday,@StartDate))%7=1
171.then1
172.else
173.0
174.end
175.-casewhen(@@Datefirst+datepart(weekday,@EndDate))%7=1
176.then1
177.else0
178.end
179.end
180.
181.go
182.
183.createfunctionudf_WeekOfMonth(@Datedatetime)
184.--返回@Date是所在月的第几周周日是当周的最后一天
185.returnsinteger
186.begin
187.returndatediff(week
188.,casewhen(@@Datefirst+datepart(weekday,dateadd(month,datediff(month,0,@Date),0)))%7=1
189.thendateadd(month,datediff(month,0,@Date),0)-1
190.else
191.dateadd(month,datediff(month,0,@Date),0)
192.end
193.,casewhen(@@Datefirst+datepart(weekday,@Date))%7=1
194.then@Date-1
195.else@Date
196.)
197.end
198.--流水号编码方式
199.--现实生活中的流水帐号的格式有五花八门,本来主要探讨一种比较普遍的格式2位字符串+4位年月日期+4位递增数字(如MA2009090001),其他格式都不是问题。
200.
201.Declare@SerialLongint,@iint,@ObjLengint
202.set@SerialLong=4--定义最大的单号长度位数
203.Declare@NowDatevarchar(10)
204.set@NowDate=GetDate()--取得本日完整日期
205.Declare@NowYearchar(4),@NowMonthchar
(2),@NowDaychar
(2)
206.set@NowYear=year(@NowDate)--取得年份
207.set@NowMonth=Month(@NowDate)--取得月份
208.set@NowDay=Day(@NowDate)--取得日期
209.Declare@FullYearchar(4),@fullMonthchar
(2),@FullDaychar
(2),@FullYMDchar(8)
210.set@fullyear=@NowYear
211.--select@fullyear
212.ifLen(@NowMonth)=1--如果月份为10月以下则在月份前加0
213.Begin
214.set@FullMonth='
0'
+@NowMonth
215.End
216.Else
217.Begin
218.set@FullMonth=@NowMonth
219.end
220.--select@FullMonth
221.--IFLEN(@NOWDAY)=1--如果日期小于10则在前面加0
222.--BEGIN
223.--SET@FULLDAY='
+@NOWDAY
224.--END
225.--Else
226.--Begin
227.--set@FullDay=@NowDay
228.--End
229.--组合今日的完整日期
230.--set@FullYmd='
MA'
+@fullyear+@fullMonth+@FullDay
231.set@FullYmd='
+@fullyear+@fullMonth
232.--select@FullYmd
233.Declare@MaxSerialchar(4)
234.--取得最大的序列号,如果为空时默认编为0:
此处请改为自已对应表的对应字段进行查询
235.select@MaxSerial=isNull(SUBSTRING(MAX(UserID),9,4),'
)FromA_CY_AdminUser
236.
237.IFisnumeric(@MaxSerial)=1--检查当前的流水号是否为数值
238.Begin
239.set@MaxSerial=@MaxSerial+1
240.set@ObjLeng=Len(@MaxSerial)
241.IF@ObjLeng<
@SerialLong
242.begin
243.set@i=0
244.While@i<
(@SerialLong-@ObjLeng)--循环判断是否小于定义长度,小于则在前面+0
245.Begin
246.set@MaxSerial='
+convert(varchar(4),@MaxSerial)
247.set@i=@i+1
248.IF@i<
(@SerialLong-@ObjLeng)
249.continue
250.Else
251.break
252.End
253.End
254.End
255.IFlen(@MaxSerial)=@SerialLong--判断序列号是否已满9999
256.Begin
257.Declare@FullSerialchar(12)
258.set@FullSerial=@FullYMD+@MaxSerial--组合新的完整编号
259.End
260.else
261.Begin
262.set@FullSerial='
263.End
264.--Select@FullSerial
265.
266.
267.--假日表
268.ifexists(select*fromdbo.sysobjectswhereid=object_id(N'
[tb_Holiday]'
)andOBJECTPROPERTY(id,N'
IsUserTable'
)=1)
269.droptable[tb_Holiday]
270.GO
271.--定义节假日表
272.CREATETABLEtb_Holiday(
273.HDatesmalldatetimeprimarykeyclustered,--节假日期
274.Namenvarchar(50)notnull)--假日名称
275.GO
276.ifexists(select*fromdbo.sysobjectswhereid=object_id(N'
[dbo].[f_WorkDay]'
)andxtypein(N'
FN'
N'
IF'
TF'
))
277.dropfunction[dbo].[f_WorkDay]
278.GO
279.--计算两个日期之间的工作天数
280.CREATEFUNCTIONf_WorkDay(
281.@dt_begindatetime,--计算的开始日期
282.@dt_enddatetime--计算的结束日期
283.)RETURNSint
284.AS
285.BEGIN
286.IF@dt_begin>
@dt_end
287.RETURN(DATEDIFF(Day,@dt_begin,@dt_end)
288.+1-(
289.SELECTCOUNT(*)FROMtb_Holiday
290.WHEREHDateBETWEEN@dt_beginAND@dt_end))
291.RETURN(-(DATEDIFF(Day,@dt_end,@dt_begin)
292.+1-(
293.SELECTCOUNT(*)FROMtb_Holiday
294.WHEREHDateBETWEEN@dt_endAND@dt_begin)))
295.END
296.GO
297.ifexists(select*fromdbo.sysobjectswhereid=object_id(N'
[dbo].[f_WorkDayADD]'
298.dropfunction[dbo].[f_WorkDayADD]
299.GO
300.--在指定日期上增加工作天数
301