這個問題如果給出的開始時間和結束時間是不跨月的比較容易做,直接用datediff()函數求出每個時間段的天數,然後sum一下就可以了,但如果時間段跨月了,就不能這樣算了。
這裏藉助一下master庫的spt_values表,對,還是它,也可以通過自增列和其他一些系統表做個臨時序列表。
if object_id('[T]') is not null drop table [T]
go
create table [T]([機器號] varchar(2),[startdate] datetime,[enddate] datetime)
insert [T]
select '1#','2009-10-20','2009-10-25' union all
select '1#','2009-09-26','2009-10-05' union all
select '2#','2009-09-12','2009-09-20' union all
select '2#','2009-09-25','2009-10-10' union all
select '2#','2009-10-25','2009-11-15' union all
select '3#','2009-08-10','2009-11-05' union all
select '2#','2009-11-25','2009-12-30'
select
機器號,
convert(varchar(7),dt,120) as [年/月],
count(1) as 天數
from
select 機器號,dateadd(dd,b.number,a.startdate) as dt
from T as a,master..spt_values b
where b.type='P'
) t
group by
order by
/**
機器號 年/月 天數
---- ------- -----------
1# 2009-09 5
1# 2009-10 11
2# 2009-09 15
2# 2009-10 17
2# 2009-11 21
2# 2009-12 30
3# 2009-08 22
3# 2009-09 30
3# 2009-10 31
3# 2009-11 5
(10 行受影響)
**/