SQL - 仅限工作时间的Dateadd?

时间:2017-11-17 15:45:32

标签: sql sql-server-2014

我想知道是否有人可以提供帮助?

我有一个包含以下列的表

creationdate (datetime)
SLAhours (int)

我想创建一个名为completebydate的列,它将是dateadd函数,将SLA小时数添加到创建日期。但是我只想在创建日期表上计算上午9点到下午5点。

例如,如果SLAhour值为9,创建日期时间为'01 sep 2017 12:30',那么completebydate将为'02 sep 2017 13:30“而不是' 01 sep 2017 21:30'

这有意义吗?这很容易吗?

2 个答案:

答案 0 :(得分:0)

是的,这是可行的。您可以在此新列completebydate上创建触发器,并在触发器中写入逻辑。因此,如果插入了其他列,触发器将自动填充日期。

如果您有大量记录,则不建议使用传入触发器选项。

答案 1 :(得分:0)

有许多不同的方法可以实现这一点,从将view写入udf,再到trigger。您可能需要提供更多有关情况的背景信息,以便有人就哪一个最适合您提供建议。

无论你怎么做,逻辑都可能如下:

declare @example table
    (
        creationdate datetime
        , slahours int
    )

insert into @example
values ('2017-09-01 12:30', 9)
    , ('2017-09-01 16:00', 12)

declare @hrs_in_day int = 8
    , @end_time time = '17:00'

select b.creationdate
, b.slahours
, dateadd(hh, b.hr_cnt, dateadd(d, b.day_cnt, b.creationdate)) as completebydate
from (
    select a.creationdate
    , a.slahours
    , a.day_cnt + case when a.hr_cnt > a.first_day_remaining_hours then 1 else 0 end as day_cnt
    , a.hr_cnt + case when a.hr_cnt > a.first_day_remaining_hours then -1 * @hrs_in_day else 0 end as hr_cnt
    from (
        select e.creationdate
        , e.slahours
        , datediff(mi, cast(e.creationdate as time), @end_time) / 60.0 as first_day_remaining_hours
        , floor(e.slahours / @hrs_in_day) as day_cnt
        , e.slahours - (floor(e.slahours / @hrs_in_day) * @hrs_in_day) as hr_cnt
        from @example as e
        ) as a
    ) as b

第一个子查询不是必需的,只是让代码更容易理解。

<强>输出:

creationdate             slahours   completebydate
2017-09-01 12:30:00.000     9       2017-09-02 13:30:00.000
2017-09-01 16:00:00.000     12      2017-09-03 12:00:00.000

就周末/假日问题而言,这可能需要一个单独的问题,但我也会围绕同一个概念看看existing questions