--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
文档为doc格式