Как узнать количество дней между двумя датами в SQL Server? - PullRequest
0 голосов
/ 27 марта 2019

Мне нужно получить количество дней между двумя датами из истории бронирования номеров у одного клиента в SQL Server. Данные имеют 3 статуса - вход, пребывание и выход.

Пример данных:

id | room  | status |   date
---+-------+--------+------------
1  |   A   |   In   | 2018-01-10
2  |   A   |   Stay | 2018-01-11
3  |   A   |   out  | 2018-01-12
4  |   B   |   In   | 2018-01-12
5  |   B   |   Stay | 2018-01-13
6  |   B   |   Out  | 2018-01-14
7  |   A   |   In   | 2018-01-14
8  |   A   |   Stay | 2018-01-15
9  |   A   |   Stay | 2018-01-16
10 |   A   |   Out  | 2018-01-17

Я ожидаю, что результат для этого клиента, количество дней в комнате A составляет 7 дней, а в комнате B - 3 дня.

Я уже пытаюсь использовать мин и макс, но результат недействителен, потому что в данных, которые клиент в итоге снова возвращается в комнату А

Для запроса я использую

SELECT
    DATEDIFF(DAY, MIN(a.LogDate), MAX(a.LogDate)) 
FROM
    CustomerLog a   
WHERE
    a.roomCode = 'A005' 
    AND a.RegistrationID = 298268   

Но для этой проблемы мне нужно изменить свой запрос, но я не знаю, как получить вторую дату для статуса 'IN' в комнате A, а также чтобы получить вторую дату для статуса 'Out' в комнате A

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Использовать Группировать по, Агрегировать мин. И макс. И функцию датировки

Пример таблицы и данных

declare @roombookingdata table
(id int ,room varchar(1), status varchar(10), recorddate date)

insert into @roombookingdata
(id , room  , status ,   recorddate)
values
(1  ,   'A'   ,   'In'   , '2018-01-10'),
(2  ,   'A'   ,   'Stay ', '2018-01-11'),
(3  ,   'A'   ,   'out'  , '2018-01-12'),
(4  ,   'B'   ,   'In'   , '2018-01-12'),
(5  ,   'B'   ,   'Stay' , '2018-01-13'),
(6  ,   'B'   ,   'Out'  , '2018-01-14'),
(7  ,   'A'   ,   'In'   , '2018-01-14'),
(8  ,   'A'   ,   'Stay' , '2018-01-15'),
(9  ,   'A'   ,   'Stay' , '2018-01-16'),
(10 ,   'A'   ,   'Out'  , '2018-01-17')

Запрос

select room, DateDiff(d, min(recorddate) , max(recorddate) ) as NooFDays, min(recorddate) as mindate, max(recorddate) as maxDate
from @roombookingdata
group by room
0 голосов
/ 27 марта 2019

Значения status кажутся неактуальными, и, поскольку у вас есть строка для каждого дня, в течение которого комната занята, будет достаточно простого подсчета отдельных значений date для каждой комнаты.Я применил отчетливо, чтобы регистрация в тот же день, что и проверка, не учитывалась дважды (в случае, если это может произойти).

Результирующий запрос:

SELECT room, COUNT(distinct date) as DaysOccupied
FROM theTable
GROUP BY room
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...