0

我目前正在尝试重新创建一个手动报告,该报告为和活动创建一个“老化”列,但从计算中排除非工作时间。这是否可以创建,我将如何在 T-SQL 中进行(SSMS 2014 或使用和 odbc 连接到 db2),我有中等水平的经验,但找不到有关此类计算的任何信息。例子 :

Datetime1 = '2015-01-30 21:30:00.000' 
Datetime2 = '2015-02-02 06:30:00.000'
DATEDIFF = 57 hours 

但是,我需要计算排除 22:00 之后或 06:00 之前和周末的任何时间,因此“老化”将读取为 1 小时。

我真的希望你能帮忙!!

4

1 回答 1

0

您可以使用下面的函数以分钟为单位计算活动,我假设一周的第一天是星期一,否则您应该修改与计算星期几(DatePart)相关的行

create function fn_activity_minutes(@Datetime1 DateTime,@Datetime2 DateTime)
Returns BigInt
as
Begin
    Declare 
            @Date1 Date, 
            @Date2 Date,
            @DateIndex Date,
            @minutes int,
            @lastDayMinutes int


    Set @Date1 = Convert(Date,@DateTime1)
    Set @Date2 = Convert(Date,@DateTime2)
    Set @minutes=DateDiff(minute,@DateTime1,DateAdd(Hour,22,convert(DateTime,@Date1)))
    if @minutes<0 
        Set @minutes=0

    Set @DateIndex=DateAdd(day,1,@Date1)
    While @DateIndex<@Date2
    Begin
        if DatePart(dw,@DateIndex) not in (6,7)  -- you can even check holdays here
            set @minutes=@minutes+16*60 -- 16 hours activity per day
        Set @DateIndex=DateAdd(day,1,@DateIndex)
    End
    if DatePart(dw,@DateIndex) not in (6,7)  -- you can even check holdays here
    Begin
        set @lastDayMinutes=DateDiff(minute,DateAdd(Hour,6,convert(DateTime,@Date2)),@DateTime2)
        if @lastDayMinutes>16*60
            set @lastDayMinutes=16*60
        if @Date1<>@Date2   
            set @minutes=@minutes+@lastDayMinutes
        Else
            Set @minutes=@minutes+@lastDayMinutes-16*60
    End
    return @minutes
End
于 2015-04-24T10:48:24.573 回答