Как получить перерыв на дни - PullRequest
0 голосов
/ 17 декабря 2011

Таблица

ID Date Time

001 12/01/2011 08:00:00
001 12/01/2011 08:30:00
001 12/01/2011 11:30:00
001 12/01/2011 12:35:00
001 12/01/2011 03:30:00
001 12/01/2011 04:30:00
002 12/01/2011 08:30:00
002 12/01/2011 09:30:00
....

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

Select id, date, min(time) as intime, max(time) as outtime from table group by id, date

вышеуказанный запрос работает для времени и времени, но я хочу выбрать время перерыва и время перерыва для дат.

Например, время перерыва между 11:30:00 и 12:30:00 означает, что запрос должен проверять время от min (время перерыва) и max (время перерыва) между 11:00:00 и 01:00:00.

Ожидаемый результат

Id Date intime outtime breakout breakin

001 08:00:00 04:30:00 11:30:00 12:35:00
002 08:30:00 09:30:00 null null 'so there is no punches between 11 to 1 for the break time, so break time should be null

Как сделать запрос для вышеуказанного условия

Нужна помощь по запросу

1 Ответ

3 голосов
/ 17 декабря 2011

Предполагая, что время перерыва всегда между 11:00 и 13:00, вы можете сделать что-то вроде ниже. По сути, используйте CTE для изготовления дополнительного столбца «BreakTime» на основе некоторой логики.

Чтобы запрос работал с вашими данными, показанными за 12 часов, я сделал (плохие) предположения в логике, что все, что между 11:00 и 13:00 или 0:00 и 1:00 перерыв В вашей реальной системе вы должны использовать 24-часовое время, чтобы у вас не было двусмысленности AM / PM. Кроме того, я не уверен, что вам нужно 2 отдельных столбца для даты и времени.

Но в любом случае, поскольку это просто пример кода для отображения запроса, я оставил его в покое.

Вот полный пример с тестовой таблицей и вашими данными:

* Обновлен для использования производной таблицы для SQL 2000 вместо CTE *

CREATE TABLE [dbo].[MyTable]
(
    ID nvarchar(5),
    MyDate date,
    MyTime time
)

insert into MyTable (ID, MyDate, MyTime) values ('001', '12/01/2011', '08:00:00')
insert into MyTable (ID, MyDate, MyTime) values ('001', '12/01/2011', '08:30:00')
insert into MyTable (ID, MyDate, MyTime) values ('001', '12/01/2011', '11:30:00')
insert into MyTable (ID, MyDate, MyTime) values ('001', '12/01/2011', '12:35:00')
insert into MyTable (ID, MyDate, MyTime) values ('001', '12/01/2011', '03:30:00')
insert into MyTable (ID, MyDate, MyTime) values ('001', '12/01/2011', '04:30:00')
insert into MyTable (ID, MyDate, MyTime) values ('002', '12/01/2011', '08:30:00')
insert into MyTable (ID, MyDate, MyTime) values ('002', '12/01/2011', '09:30:00')

select 
    ID, 
    MyDate, 
    min(MyTime) as intime, 
    max(MyTime) as outtime,
    min(BreakTime) as break_intime, 
    max(BreakTime) as break_outtime
FROM 
(
    SELECT *,
        CASE 
            WHEN (MyTime > '11:00:00' and MyTime < '13:00:00') THEN MyTime
            WHEN (MyTime > '0:00:00' and MyTime < '1:00:00') THEN MyTime
            ELSE null
        END AS BreakTime
    from MyTable 
) as DerivedTable
group by ID, MyDate

И вывод:

ID  MyDate  intime  outtime break_intime    break_outtime
001 2011-12-01  03:30:00.0000000    12:35:00.0000000    11:30:00.0000000    12:35:00.0000000
002 2011-12-01  08:30:00.0000000    09:30:00.0000000    NULL    NULL
...