1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
|
СОЗДАЙТЕ ФУНКЦИЮ [dbo]. [CalcMinutesSLA_TFAM] (
DATETIME @startTime,
DATETIME @endTime
)
возвращает int
как
начните
объявите @minutes int;
объявите datetime @startPlus1
объявите datetime @endLess1
-- разработайте ряд на целые дни in-between
выберите @startPlus1 = datediff (d, 0, @startTime+1),
@endLess1 = datediff (d, 0, @endTime-1)
-- проверите сколько дни non-викэнда существуют в этом ряде
выберите @minutes = 480 * (новообращенный (int, @endLess1-@startPlus1) /7*5 + отсчет (*))
от оригинала. .spt_values
где type='P и номер между 0 и datediff (d,
@startPlus1+convert (int, @endLess1-@startPlus1) /7*7, @endLess1)
и datename (dw, @startPlus1+number)! = «s»
-- проверите сколько праздники non-викэнда существуют в этом ряде
выберите @minutes = @minutes - отсчет (*)
от web_holidays
где HolidayDate между @startPlus1 и @endless1
и о (datename (dw, HolidayDate), 1)! = «s»
-- отрегулируйте времена на сперва/последние дни
если @endTime 17 datepart (hh, < 9="" set="">@startTime) = установленные = datediff (dd, 0, @endTime) +17.0/24
если возвращение @endTime >= @startTime коалесцирует, то (@minutes, 0);
-- если датой начала не будет праздником и не викэндом, то добавьте минуты
выберите @minutes = @minutes +
datediff (mi, @startTime, datediff (dd, 0, @startTime) +17.0/24)
где не существует (
выберите * от web_holidays
где HolidayDate = datediff (dd, 0, @startTime))
и о (datename (dw, @startTime), 1)! = «s»
-- если датой конца не будет праздником и не викэндом, то добавьте минуты
выберите @minutes = @minutes +
datediff (mi, datediff (dd, 0, @endTime) +9.0/24, @endTime)
где не существует (
выберите * от web_holidays
где HolidayDate = datediff (dd, 0, @endTime))
и о (datename (dw, @endTime), 1)! = «s»
-- если start=end, мы подсчитывало день дважды, то примите 480
выберите @minutes = @minutes - 480
где не существует (
выберите * от web_holidays
где HolidayDate = datediff (dd, 0, @endTime))
и о (datename (dw, @endTime), 1)! = «s»
и datediff (d, @startTime, @endTime) = 0 -- такой же день
возвратите коалесцируйте (@minutes, 0);
конец
ИДИТЕ
|