我想知道是否有人可以提供帮助?
我有一个包含以下列的表
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'
这有意义吗?这很容易吗?
答案 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。