这个问题如果给出的开始时间和结束时间是不跨月的比较容易做,直接用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
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'
select 机器号 , dateadd( dd ,b . number , a . startdate) as dt
from T as a , master .. spt_values b
where b . type = 'P'
and
dateadd(
dd
,b
.
number
,
a
.
startdate)
<=
a
.
enddate
) t
group by
) t
group by
机器号
,
convert(
varchar(
7
),
dt
,
120)
order by
order by
机器号
,
convert(
varchar(
7
),
dt
,
120)
/**
机器号 年/月 天数
---- ------- -----------
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 行受影响)
**/
/**
机器号 年/月 天数
---- ------- -----------
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 行受影响)
**/