高手帮忙,分月汇总机器工作天数

flyfly2008 2009-10-16 11:09:14
表T:
机器号 startdate enddate
1# 2009-10-20 2009-10-25
1# 2009-09-26 2009-10-05
2# 2009-09-12 2009-09-20
2# 2009-09-25 2009-10-10
2# 2009-10-25 2009-11-15
3# 2009-08-10 2009-11-05

.
.
.

要统计每台机每个月使用情况(要得到结果)
机器号 年/月 天数
1# 2009-09 4
1# 2009-10 10
2# 2009-09 13
2# 2009-10 16
2# 2009-11 15
3# 2009-08 21
3# 2009-09 30
3# 2009-10 31
3# 2009-11 5

...全文
197 32 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
luoyoumou 2009-10-16
  • 打赏
  • 举报
回复
-----向牛人学习!
luoyoumou 2009-10-16
  • 打赏
  • 举报
回复
---就22楼,四方城的就OK了!
luoyoumou 2009-10-16
  • 打赏
  • 举报
回复
--呵呵:四方城还是挺牛皮的啊............. (:
sgtzzc 2009-10-16
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 xuam 的回复:]
引用 10 楼 sgtzzc 的回复:
SQL codeifobject_id('[T]')isnotnulldroptable[T]gocreatetable[T]([机器号]varchar(2),[startdate]datetime,[enddate]datetime)insert[T]select'1#','2009-10-20','2009-10-25'unionallselect'1#','2009-09-26','2009¡­
加一条
'2#','2009-11-25','2009-12-30' 
看看,就会不对了.
[/Quote]
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 行受影响)
**/

没发现不对,楼主可以测试一下
xuam 2009-10-16
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 flyfly2008 的回复:]
谢谢楼上的,机器使用不会出现时间重叠,谢谢你的担心


[/Quote]
知道数据不会重叠, 但是可以跨月, 跨月又分开始的日期小于,或者大于 结束的日期,这些需要考虑
flyfly2008 2009-10-16
  • 打赏
  • 举报
回复
谢谢楼上的,机器使用不会出现时间重叠,谢谢你的担心

水族杰纶 2009-10-16
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sgtzzc 的回复:]
SQL codeifobject_id('[T]')isnotnulldroptable[T]gocreatetable[T]([机器号]varchar(2),[startdate]datetime,[enddate]datetime)insert[T]select'1#','2009-10-20','2009-10-25'unionallselect'1#','2009-09-26','2009¡­
[/Quote]
學習樹兄~~
xuam 2009-10-16
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 luoyoumou 的回复:]
--楼主:别结帖早了,我用游标整一个给你瞧瞧...........
[/Quote]
游标可以实现,不过太麻烦, 还不如写个存储过程呢,哈哈
nianran520 2009-10-16
  • 打赏
  • 举报
回复
学习。[Quote=引用 10 楼 sgtzzc 的回复:]
SQL codeifobject_id('[T]')isnotnulldroptable[T]gocreatetable[T]([机器号]varchar(2),[startdate]datetime,[enddate]datetime)insert[T]select'1#','2009-10-20','2009-10-25'unionallselect'1#','2009-09-26','2009¡­
[/Quote]
luoyoumou 2009-10-16
  • 打赏
  • 举报
回复
--楼主:别结帖早了,我用游标整一个给你瞧瞧...........
xuam 2009-10-16
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sgtzzc 的回复:]
SQL codeifobject_id('[T]')isnotnulldroptable[T]gocreatetable[T]([机器号]varchar(2),[startdate]datetime,[enddate]datetime)insert[T]select'1#','2009-10-20','2009-10-25'unionallselect'1#','2009-09-26','2009¡­
[/Quote]

加一条
'2#','2009-11-25','2009-12-30'
看看,就会不对了.
sgtzzc 2009-10-16
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 luoyoumou 的回复:]
---楼上的:没这么简单!
[/Quote]

你认为有多复杂呢?
xuam 2009-10-16
  • 打赏
  • 举报
回复
确实有点麻烦! 还不能跨月统计
guguda2008 2009-10-16
  • 打赏
  • 举报
回复
刚看到,用几个计算列就搞定了
luoyoumou 2009-10-16
  • 打赏
  • 举报
回复
---楼上的:没这么简单!
sgtzzc 2009-10-16
  • 打赏
  • 举报
回复
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'

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 15
3# 2009-08 22
3# 2009-09 30
3# 2009-10 31
3# 2009-11 5

(9 行受影响)
**/
xuam 2009-10-16
  • 打赏
  • 举报
回复
select 机器号, convert (char(7),startdate,120) as 年/月, sum(DATEDIFF ( day , startdate , enddate )) from T
group by 机器号, convert (char(7),startdate,120)
xuam 2009-10-16
  • 打赏
  • 举报
回复
select 机器号, convert (char(7,)startdate,120) as 年/月, sum(DATEDIFF ( day , startdate , enddate )) from T
group by 机器号, convert (char(7),startdate,120)
luoyoumou 2009-10-16
  • 打赏
  • 举报
回复
-- 俺试着用游标给你整一个?
luoyoumou 2009-10-16
  • 打赏
  • 举报
回复
----哇:这有难度,要是机器几年不停机,这就麻烦了.........
加载更多回复(12)

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧