一个计算每日工时的SQL函数

1 问题

客户需要在指定的日期范围内,计算出每日机器设备的运行时间。

比如机器设备在3月份的运行时间为从 2014-3-20 23:00:00 到 2014-3-22 2:00:00,那么查询该月所得到的结果应该为:

日期时间
2014-3-201小时
2014-3-2124小时
2014-3-222小时

 

2 分析

1)如何将一个日期范围分割成连续的每一天?

2)查询范围和运行时间的关系?

图像 8

3 实现

自定义SQL函数:

-- =============================================
-- Author:        locus
-- Create date:   2013-12-31
-- Description:   calculate working time for every day in a given date range
-- =============================================
Create FUNCTION [Fun_WorkingTimePerDay] 
(
    -- Add the parameters for the function here
    @lowDate datetime,   --low of date range
    @highDate datetime,  --high of date range
    @startDate datetime, --actual start date
    @endDate datetime    --actual end date
)
RETURNS 
@output TABLE 
(
    -- Add the column definitions for the TABLE variable here
    [Day] datetime, 
    [Seconds] int
)
AS
BEGIN
    -- Fill the table variable with the rows for your result set
    set @lowDate = Convert(char(10), @lowDate, 120)
    set @highDate = Convert(char(10), @highDate, 120)
    if(@endDate is null) set @endDate = @highDate
    declare @day datetime  
    declare @n int
    declare @i int
    set @n = datediff(day, @lowDate, @highDate)
    set @i = 0
    while @i<@n
        begin
            set @day = dateadd(day, @i, @lowDate)
            
            if(datediff(day, @startDate, @day) > 0 and datediff(day, @endDate, @day) = 0)
            --start < day < end < day+1
                insert into @output select @day, datediff(second, @day, @endDate)
            else if(datediff(day, @startDate, @day) = 0 and datediff(day, @endDate, @day) < 0)
            --day < start < day+1 < end
                insert into @output select @day, datediff(second, @startDate, dateadd(day, 1, @day))
            else if(datediff(day, @startDate, @day) = 0 and datediff(day, @endDate, @day) = 0)
            --day < start < end < day+1
                insert into @output select @day, datediff(second, @startDate, @endDate)
            else if(datediff(day, @startDate, @day) > 0 and datediff(day, @endDate, @day) < 0)
            --start < day < day+1 < end
                insert into @output select @day, datediff(second, @day, dateadd(day, 1, @day))
            
            set @i=@i+1
        end    
        
    RETURN 
END

运行:

select * from 
Fun_WorkingTimePerDay('2014-3-1','2014-3-31','2014-3-20 23:00:00','2014-3-25 2:00:00')

结果:

image

转载于:https://www.cnblogs.com/uhavemyword/p/3622934.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值