Мне нужно получить разницу во времени в днях между двумя строками дат одной и той же истории записей в SQL Server 2016 - PullRequest
0 голосов
/ 07 июня 2019

У меня есть таблица (называемая STAT) для отслеживания изменения статуса заказа на работу, например:

| WORKNUM    | STATUS    | CHANGE_DATE             |
+------------+-----------+-------------------------+
| WO-1057004 | APPROVED  | 2018-05-25 05:53:34.157 |
| WO-1057004 | COMPLETED | 2018-06-13 06:45:4O.244 |
| WO-1057004 | REVIEWED  | 2018-07-05 03:53:35.231 |

Мне нужно найти время в днях, которое прошло от состояния «ЗАВЕРШЕНО» до состояния «ОБЗОР», для одного и того же рабочего задания - т.е. разница в CHANGE_DATE между этими двумя статусами в днях.

Я использую SQL Server 2016.

Я не знаю, с чего начать,но я ищу что-то вроде этого:

| WORKNUM    | STATUS    | CHANGE_DATE             | TIME_TAKEN |
+------------+-----------+-------------------------+------------+
| WO-1057004 | APPROVED  | 2018-05-25 05:53:34.157 |     0      |
| WO-1057004 | COMPLETED | 2018-06-13 06:45:4O.244 |    19      |
| WO-1057004 | REVIEWED  | 2018-07-05 03:53:35.231 |    22      |

Ваша помощь очень ценится.

Спасибо.

Ответы [ 3 ]

0 голосов
/ 07 июня 2019

Один из способов, который по меньшей мере легко читается и переносим, ​​является:

select
    STAT.WORKNUM,
    STATUS,
    CHANGE_DATE,
    DATEDIFF(day, APPROVED_DATE, CHANGE_DATE) as TIME_TAKEN
from STAT
join (
    select WORKNUM, CHANGE_DATE as APPROVED_DATE
    from STAT
    where STATUS = 'APPROVED'
) APPROVED_DATES on APPROVED_DATES.WORKNUM = STAT.WORKNUM

Подзапрос возвращает (что неудивительно, учитывая его псевдоним) все утвержденные даты.Каждая строка соединяется с этим, чтобы можно было рассчитать разницу.

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

0 голосов
/ 07 июня 2019
SELECT *,
case when status='APPROVED' then 0 when status='COMPLETED' then 
datediff(day,(select change_date from STAT where status='APPROVED'),(select change_date from STAT where status='COMPLETED')) 
when status='REVIEWED' then 
datediff(day,(select change_date from STAT where status='COMPLETED'),(select change_date from STAT where status='REVIEWED')) 
end NoOfDays
FROM STAT

enter image description here

0 голосов
/ 07 июня 2019

Попробуйте следующее:

    select worknum,[status],change_date,
CASE
    WHEN [status]='COMPLETED' THEN 
        DATEDIFF(day, change_date, (select top 1 change_date from stat as stat_approved where stat_approved.[status]='APPROVED' and stat_approved.worknum=stat.worknum))
    WHEN [status]='APPROVED' THEN 
        DATEDIFF(day, change_date, (select top 1 change_date from stat as stat_completed where stat_completed.[status]='COMPLETED' and stat_completed.worknum=stat.worknum))    
    ELSE 0
END as TIME_TAKEN
from stat
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...