+ -
当前位置:首页 → 问答吧 → 跨月的时段如何拆分

跨月的时段如何拆分

时间:2011-11-09

来源:互联网

SQL code

--测试数据
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

SQL code
--测试数据
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

SQL code

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

SQL code
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

大版和小三的结果好像有点不对.我完整的测试数据,应该是7.5

作者: chirea   发布时间: 2011-11-09

引用 11 楼 chirea 的回复:

大版和小三的结果好像有点不对.我完整的测试数据,应该是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