СЕКУНДОМЕР для колонки - PullRequest
0 голосов
/ 10 июля 2020

В службе поддержки нашей организации мы хотели бы подсчитать время, потраченное с момента создания заявки. У нас много локаций с разными настройками рабочего времени. Некоторые локации будут работать круглосуточно, а некоторые - с 9 утра до 5 вечера. Каждое утро мне нужно запускать запрос, чтобы получить билеты с возрастом более 8 часов и выполнить какие-то действия с ними. Есть ли на сервере SQL столбец секундомера или любой другой вариант, с помощью которого возраст автоматически увеличивается в минутах, чтобы при каждом запросе мы могли получить точный возраст с момента создания.

Например, если местонахождением является филиал, и билет, созданный в 15:00 07.07.2020, и если запрос выполняется 11.07.2020 09:00, возраст согласно рабочим часам (с 9:00 до 17:00) составляет 2 часа. Если местонахождение билета находится в головном офисе, то часы работы - 24x7, а возраст билета в рабочее время будет 18 часов.

Добавлены 3 столбца для обработки этой информации ..

IS_TIMER_RUNNING: истина | false true: в рабочее время (с 9:00 до 17:00). false: в нерабочее время (с 17:00 до 9:00). TIMER_RUNNING_TIME: datetime TICKET_AGE: время в секундах

При использовании задания в 9 утра для IS_TIMER_RUNNING будет установлено значение true. В задании 17:00 для IS_TIMER_RUNNING будет установлено значение false, а в TICKET_AGE будет указано время в секундах до конца этого времени.

Я попробовал следующий запрос, который дает ожидаемый запрос.

SELECT 
  TICKETID, 
  CONVERT(
    VARCHAR, 
    DATEADD(
      s, 
      CASE WHEN IS_TIMER_RUNNING = '1' THEN datediff(
        s, 
        dateadd(
          s, 
          (wo.TIMER_RUNNING_TIME / 1000), 
          '1970-01-01 00:00:00'
        ), 
        GETUTCDATE()
      ) + TICKET_AGE ELSE TICKET_AGE END, 
      '1900/01/01'
    ), 
    108
  ) 
FROM 
  TICKET

Пожалуйста, сообщите, доступен ли другой лучший вариант

1 Ответ

0 голосов
/ 10 июля 2020

Вы можете создать таблицу со всеми часами работы (с учетом выходных, праздников и другого графика работы). После этого вы присоединяете эту таблицу с рабочими часами к своему билету (с учетом действующего расписания), а затем используете DATEDIFF для расчета прошедшего времени.

например, создавая «таблицу рабочих часов»

SET DATEFIRST 1;

WITH CTE
AS
(
SELECT cast('2020-01-01' as datetime) as theDate
UNION ALL
SELECT dateadd(day,1,theDate)
FROM CTE
WHERE theDate<='2020-12-31'
)
SELECT 1 as BusinessHoursId,DateAdd(hh,9,theDate) as SOB,DATEADD(hh,17,theDate) as EOB
into Businesshours
FROM CTE
WHERE DATEPART(DW,theDate) between 1 and 5
option (maxrecursion 0)

Затем вы можете использовать эту таблицу в объединении:

SELECT TicketId,
       SUM(DATEDIFF(n,
               CASE WHEN t.Created > bh.SOB THEN t.Created ELSE bh.SOB END ,
               CASE WHEN t.Closed < bh.EOB THEN t.Closed ELSE bh.EOB END
               )
          )
         
FROM Tickets t
JOIN Businesshours bh
ON t.Created < bh.EOB
AND t.Closed > bh.SOB
GROUP BY TicketId
...