Как я могу суммировать значения времени (хранящиеся как varchars), которые превышают обычное значение varchar? - PullRequest
0 голосов
/ 19 декабря 2018

У меня проблемы со сценарием, над которым я работаю.То, что у меня есть, это значения в базе данных, когда приложение выключено, когда оно снова включено, и общая продолжительность выключения приложения.С помощью сценария, который я использую сейчас, иногда TotalDownTime превышает 24 часа.Это сделано намеренно, и я бы хотел оставить это так.Однако я также хотел бы иметь возможность суммировать все значения TotalDownTimes в одно значение на основании причины, по которой эти приложения были закрыты.Как это лучше всего сделать?

Вот несколько примеров, которые я использую:

Reason                  Shutdowndate            StartupDate             TotalDownTime
Scheduled Maintenance   2018-12-10 09:31:47.317 2018-12-10 11:31:47.317 02:00:00:000
Scheduled Maintenance   2018-12-10 09:38:00.373 2018-12-10 09:45:38.613 00:07:38:240
Scheduled Maintenance   2018-12-10 10:43:01.000 2018-12-18 08:22:02.873 21:39:01:873
Scheduled Maintenance   2018-12-16 00:01:07.697 2018-12-16 12:00:10.953 11:59:03:257
Scheduled Maintenance   2018-12-01 00:00:00.000 2018-12-18 13:54:16.500 421:54:16:000
Scheduled Maintenance   2018-12-06 00:00:00.000 2018-12-18 08:41:45.007 296:41:45

Вот то, что я использую для присвоения значения TotalDownTime:

Update ProductionShutdownRecord 
set TotalDownTime = CAST(DATEDIFF(HOUR, [ShutdownDate], [Startupdate]) AS VARCHAR)
     + RIGHT(CONVERT(CHAR(8),DATEADD(SECOND,DATEDIFF(SECOND, [ShutdownDate], [Startupdate]),0),114),6)
where shutdownId = 18

И вот что я пытаюсь использовать для суммирования значений, я получаю ошибку: «Преобразование типа данных char в тип данных datetime привело к значению datetime вне диапазона.»:

select convert(char(8),dateadd(second,SUM ( DATEPART(hh,(convert(datetime,TotalDownTime,1))) * 3600 +
DATEPART(mi, (convert(datetime,TotalDownTime,1))) * 60 + DATEPART(ss,(convert(datetime,TotalDownTime,1)))),0),108)
FROM ProductionShutdownRecord
where Reason like 'Scheduled Maintenance%'
and ShutdownDate >= '01/01/2018'
and ShutdownDate <= '01/01/2019'
and startupdate is not null

Любая помощь приветствуется, спасибо!

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Какие типы данных являются полями в вашей таблице?

Я бы рассматривал TotalDownTime как INT или BIGINT с разницей, хранящейся в кратных самой низкой требуемой части времени.например, DATEDIFF (второй, Startupdate, Shutdowndate) или DATEDIFF_BIG (второй, Startupdate, Shutdowndate).Тогда СУММА тривиальна.

Затем возникает проблема форматирования вывода, чтобы получить его в любом желаемом формате строки, который также должен быть прямым - если вам нужен формат, доступный непосредственно в базе данных, добавьте вычисляемое поле в таблицу.

0 голосов
/ 19 декабря 2018

Ниже приведен один метод, использующий FORMAT для облегчения форматирования вашего нестандартного формата времени:

WITH downtime AS (
    SELECT
      Reason
    , Shutdowndate
    , StartupDate
    , DATEADD(millisecond, DATEDIFF(millisecond, Shutdowndate, StartupDate), '') AS DownTime
    FROM dbo.ApplicationDowntime
)
SELECT
      Reason
    , Shutdowndate
    , StartupDate
    , FORMAT(((DATEPART(day, DownTime) - 1) * 24) + DATEPART(hour, DownTime), '00:')
        + FORMAT(DownTime, 'mm:ss:fff') AS TotalDownTime
FROM downtime;

Обратите внимание, что для третьей строки результатов выборки возвращается 189:39:01:873:

+-----------------------+-------------------------+-------------------------+---------------+
|        Reason         |      Shutdowndate       |       StartupDate       | TotalDownTime |
+-----------------------+-------------------------+-------------------------+---------------+
| Scheduled Maintenance | 2018-12-10 09:31:47.317 | 2018-12-10 11:31:47.317 | 02:00:00:000  |
| Scheduled Maintenance | 2018-12-10 09:38:00.373 | 2018-12-10 09:45:38.613 | 00:07:38:240  |
| Scheduled Maintenance | 2018-12-10 10:43:01.000 | 2018-12-18 08:22:02.873 | 189:39:01:873 |
| Scheduled Maintenance | 2018-12-16 00:01:07.697 | 2018-12-16 12:00:10.953 | 11:59:03:257  |
| Scheduled Maintenance | 2018-12-01 00:00:00.000 | 2018-12-18 13:54:16.500 | 421:54:16:500 |
| Scheduled Maintenance | 2018-12-06 00:00:00.000 | 2018-12-18 08:41:45.007 | 296:41:45:007 |
+-----------------------+-------------------------+-------------------------+---------------+
...