MS SQL数据库关于时间循环如何处理跨天问题 100

有如下表:--------------------------------------------------------------------------------... 有如下表:
-----------------------------------------------------------------------------------------------------------------
设备 开始时间 结束时间 总时间(分钟)
A 2015-08-01 17:06:49 2015-08-02 03:41:32 635
B 2015-08-01 20:54:42 2015-08-03 23:59:59 3605
----------------------------------------------------------------------------------------------------------------
需求:
1、将每个设备的时间段循环得出每天总时间
2、1天的时间计算结果必须是1440
3、不能用游标方式处理
需求结果集表如下:
-----------------------------------------------------------------------------------------------------------------
设备 开始时间 结束时间 总时间(分钟)
A 2015-08-01 17:06:49 2015-08-01 23:59:59 413
A 2015-08-02 00:00:00 2015-08-02 03:41:32 222
B 2015-08-01 20:54:42 2015-08-01 23:59:59 185
B 2015-08-02 00:00:00 2015-08-02 23:59:59 1440
B 2015-08-03 00:00:00 2015-08-03 23:59:59 1440
----------------------------------------------------------------------------------------------------------------------

请各位大虾告之,希望提供直接得出结果集的脚本供参考。
展开
 我来答
zxchan1992
2015-08-29 · TA获得超过278个赞
知道小有建树答主
回答量:179
采纳率:0%
帮助的人:233万
展开全部
--sql2005+,CTE表达式,不过看上去比while复杂
--建表

create table T
(
设备 varchar(10),
开始时间 datetime,
结束时间 datetime
)

--插入数控
insert into t values('A','2015-08-01 17:06:49', '2015-08-02 03:41:32')  
insert into t values('B','2015-08-01 20:54:42', '2015-08-03 23:59:59')  

With CT
As
(
    Select 设备,开始时间,结束时间
    From T
    Union all 
    Select 设备,DATEADD(DAY,1,开始肆埋扮时间),结束时间 From ct
    Where 液燃DATEADD(DAY,1,开始时间)<DATEADD(DAY,1,结束时间) 
)
Select 设备,开始时间,结束时间,DATEDIFF(MI,开始时间,结束时间)+
Case When id>1 Then 1 Else 0 End  As 分钟 
From 
(
    Select id,设备,
    Case When id>1 Then Convert(Datetime,Convert(Varchar(8),开始时间,112)) 
    Else 开始时间 End As 开始时间,
    Case When id=cnt Then 结束时间 
    Else Convert(Datetime,Convert(Varchar(8),开始时间,112)+' 23:59:59') End As 结束时间
    From 
    (
        Select *,ROW_NUMBER() 裂灶Over(Partition By 设备 Order by 开始时间) As id,
        COUNT(*) Over(PARTITION by 设备) As cnt
        From CT
        Where Convert(Varchar(8),开始时间,112)<=Convert(Varchar(8),结束时间,112)
    ) N 
) M


HisVdh
2015-08-29 · TA获得超过369个赞
知道小有建树答主
回答量:571
采纳率:0%
帮助的人:186万
展开全部
不用游标处理不了吧。
追问
我已经用while搞定了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式