通过开始时间和结束时间按月统计工作天数

     这个问题如果给出的开始时间和结束时间是不跨月的比较容易做,直接用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'
   and dateadd( dd ,b . number , a . startdate) <= a . enddate
   ) t
group by
  机器号 , convert( varchar( 7 ), dt , 120)
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 行受影响)
**/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值