跨月的时段如何拆分
时间:2011-11-09
来源:互联网
--测试数据 create table #test (员工编号 nvarchar(50),开始时间 datetime,结束时间 datetime,请假天数 decimal(4,1)) insert into #test values('1030','2011-10-08 14:00:00.000','2011-11-03 14:00:00.000',3.0) insert into #test values('1030','2011-11-08 14:00:00.000','2011-11-11 14:00:00.000',3.0) insert into #test values('1030','2011-11-12 08:43:00.000','2011-11-12 12:43:00.000',0.5) insert into #test values('1030','2011-11-29 15:27:00.000','2011-12-09 15:27:00.000',10.0)
怎么求出员工编号1030的11月份请假天数.
作者: chirea 发布时间: 2011-11-09
作者: qianjin036a 发布时间: 2011-11-09
--测试数据 create table #test (员工编号 nvarchar(50),开始时间 datetime,结束时间 datetime,请假天数 decimal(4,1)) insert into #test values('1030','2011-11-08 14:00:00.000','2011-11-11 14:00:00.000',3.0) insert into #test values('1030','2011-11-12 08:43:00.000','2011-11-12 12:43:00.000',0.5) insert into #test values('1030','2011-11-29 15:27:00.000','2011-12-09 15:27:00.000',10.0) GO SELECT CONVERT(VARCHAR(7),开始时间+a.number ,120),COUNT(a.number) FROM master.dbo.spt_values AS a,#test AS b WHERE a.type='P' AND 开始时间+a.number<=结束时间 AND a.number>0 GROUP BY CONVERT(VARCHAR(7),开始时间+a.number ,120)
作者: roy_88 发布时间: 2011-11-09
create table #test (员工编号 nvarchar(50),开始时间 datetime,结束时间 datetime,请假天数 decimal(4,1)) insert into #test values('1030','2011-11-08 14:00:00.000','2011-11-11 14:00:00.000',3.0) insert into #test values('1030','2011-11-12 08:43:00.000','2011-11-12 12:43:00.000',0.5) insert into #test values('1030','2011-11-29 15:27:00.000','2011-12-09 15:27:00.000',10.0) go select 员工编号,sum(case when convert(varchar(6),开始时间,112) = convert(varchar(6),结束时间,112) then 请假天数 else datediff(dd,开始时间,convert(varchar(6),dateadd(mm,1,开始时间),112)+'01') end) cnt from #test group by 员工编号 drop table #test /************** 员工编号 cnt -------------------------------------------------- --------------------------------------- 1030 5.5 (1 行受影响)
作者: AcHerat 发布时间: 2011-11-09
作者: roy_88 发布时间: 2011-11-09
insert into #test values('1030','2011-10-28 14:00:00.000','2011-11-02 14:00:00.000',5.0)
作者: chirea 发布时间: 2011-11-09
作者: chirea 发布时间: 2011-11-09
作者: qianjin036a 发布时间: 2011-11-09
select sum(请假天数) from( select 请假天数 from #test where 开始时间>'2011-11-01' and 结束时间<'2011-12-01' union all select datediff(day,'2011-11-01',结束时间) from #test where 开始时间<'2011-11-01' and 结束时间>'2011-11-01' union all select datediff(day,开始时间,'2011-12-01') from #test where 开始时间>'2011-11-01' and 结束时间>'2011-12-01' ) t --貌似很不帅
作者: Beirut 发布时间: 2011-11-09
作者: Beirut 发布时间: 2011-11-09
作者: fredrickhu 发布时间: 2011-11-09
作者: chirea 发布时间: 2011-11-09
大版和小三的结果好像有点不对.我完整的测试数据,应该是7.5
SQL code
----测试数据 --create table #test (员工编号 nvarchar(50),开始时间 datetime,结束时间 datetime,请假天数 decimal(4,1)) --insert into #test values('1030','2011-10-28 14:00:00.000','2011-11-02 14:00:00.000',5.0) --insert into #test values('1030','2011-11-08 14:00:00.000','2011-11-11 14:00:00.000',3.0) --insert into #test values('1030','2011-11-12 08:43:00.000','2011-11-12 12:43:00.000',0.5) --insert into #test values('1030','2011-11-29 15:27:00.000','2011-12-09 15:27:00.000',10.0) GO DECLARE @dt DATETIME SET @dt='20111101' SELECT 员工编号,SUM(diffday+CASE WHEN 开始时间<@dt THEN DATEDIFF(d,@dt,开始时间) ELSE 0 END+CASE WHEN 结束时间>DATEADD(m,1,@dt) THEN DATEDIFF(d,结束时间,DATEADD(m,1,@dt))+1 ELSE 0 end +DATEDIFF(hh,DATEADD(d,diffday,开始时间),结束时间)/4*0.5) AS 天數 FROM ( SELECT 员工编号,DATEDIFF(d,开始时间,结束时间) AS diffday,开始时间,结束时间 FROM #test WHERE 开始时间<DATEADD(m,1,@dt) AND 结束时间>@dt )t GROUP BY 员工编号 /* 员工编号 天數 1030 7.5 */
作者: roy_88 发布时间: 2011-11-09
作者: roy_88 发布时间: 2011-11-09
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28