SQL SERVER--时间段按月划分

发布时间:2018-06-12 12:20:53   来源:文档文库   
字号:

--SQL SERVER 数据库之时间段按月划分

--样例数据

CREATETABLE[dbo].[xj](

[id][varchar](50)NULL,

[姓名][varchar](50)NULL,

[休假种类][varchar](50)NULL,

[起始日期][smalldatetime]NULL,

[上下午1][varchar](10)NULL,

[终止日期][smalldatetime]NULL,

[上下午2][varchar](10)NULL

)

GO

Insertintoxj(id,姓名,休假种类,起始日期,上下午1,终止日期,上下午2)

Values('001','张三','病假','2018/1/15','下午','2018/1/31','')

Insertintoxj(id,姓名,休假种类,起始日期,上下午1,终止日期,上下午2)

Values('001','张三','病假','2018/2/10','','2018/4/5','上午')

Insertintoxj(id,姓名,休假种类,起始日期,上下午1,终止日期,上下午2)

Values('002','李四','产假','2018/1/10','','2018/4/10','')

Go

Select*fromxj

go

--关联表函数

CREATEFUNCTION[dbo].[Get_日期分月]

--按月划分时间段

(

@sdate smalldatetime, --起始日期

@sxw1 varchar(10),

@edatesmalldatetime, --终止日期

@sxw2 varchar(10)

)

RETURNS@pTabletable(

月初日期 smalldatetime,

上下午1 varchar(10),

月末日期 smalldatetime,

上下午2 varchar(10)

)

AS

BEGIN

declare@dsmallint

declare@ismallint

declare@newdatesmalldatetime

set@i=0

select@d=datediff(month,@sdate,@edate)

if@d=0 --起始日期与终止日期在一个月内

begin

insertinto@ptable(月初日期,上下午1,月末日期,上下午2)values(@sdate,@sxw1,@edate,@sxw2)

return

end

if@d=1 --起始日期与终止日期相差一个月

begin

insertinto@ptable(月初日期,上下午1,月末日期,上下午2)

values(

@sdate

,@sxw1

,DATEADD(Day,-1,CONVERT(char(8),DATEADD(Month,@i+1,@sdate),120)+'1')

,@sxw2)

insertinto@ptable(月初日期,上下午1,月末日期,上下午2)

values(dateadd(mm,datediff(mm,@i,@edate),0),@sxw1,@edate,@sxw2)

end

if@d>1 --起始日期与终止日期相差一个月以上

begin

insertinto@ptable(月初日期,上下午1,月末日期,上下午2)

values(

@sdate

,@sxw1

,DATEADD(Day,-1,CONVERT(char(8),DATEADD(Month,@i+1,@sdate),120)+'1')

,'')

set@i=@i+1

while@i<=@d-1

begin

set@i=@i+1

insertinto@ptable(月初日期,上下午1,月末日期,上下午2)

values(

DATEADD(mm,datediff(mm,@i,DATEADD(Month,@i-1,@sdate)),0)

,'' ,DATEADD(Day,-1,CONVERT(char(8),DATEADD(Month,@i,@sdate),120)+'1')

,'')

end

insertinto@ptable(月初日期,上下午1,月末日期,上下午2)

values(dateadd(mm,datediff(mm,@i,@edate),0)

,''

,@edate

,@sxw2)

end

return

END

GO


--调用Select 语句

selecta.id,

a.姓名,

a.休假种类,

b.月初日期,

b.上下午1,

b.月末日期,

b.上下午2

fromxja

crossapply

dbo.get_日期分月(a.起始日期,a.上下午1,a.终止日期,a.上下午2)b

go

本文来源:https://www.2haoxitong.net/k/doc/b957d698f605cc1755270722192e453610665bbc.html

《SQL SERVER--时间段按月划分.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式