Если для отчета, то вы должны просто иметь возможность выполнить запрос / объединение, которые дают две записи во время этих условий, начиная с исходной, начиная с ... Без SQL-Server 2008 я могу предложить только псевдокодзапрос для вас.
Первая часть получает все записи в зависимости от того, какое условие диапазона вы хотите показать.Значение «OutTime» является условным ... если оно в один и тот же день, то переход отсутствует, просто используйте время ожидания.Если это на следующий день, используйте приведение для динамического построения даты «ГГГГ-ММ-ДД» (по умолчанию время 00:00:00) в соответствии с желаемым временем OUT.
UNION будет забирать ТОЛЬКО те же самые записи, которые были квалифицированы в ПЕРВЫХ, где даты ввода / вывода различны.Таким образом, мы ЗНАЕМ, что мы хотим, чтобы OutTime действовал как InTime, но на основе времени «00:00:00», поэтому выполняется точно такое же преобразование поля даты / времени, и для этих записей простоиспользуйте окончательное значение «OutTime» как есть.
Дополнительный столбец для «TimeSplit» со значением «1» или «2» предназначен для того, чтобы убедиться, что мы все еще можем группировать по идентификатору сотрудника, но с этогочто записи «1» (начальная смена) являются первыми, а затем любые записи для соответствующего человека имеют запись «2» для перекрытия дня в своей смене.
select
tc.EmployeeID,
'1' as TimeSplit,
tc.InTime,
case when datepart( dd, tc.InTime ) = datepart( dd, tc.OutTime )
then tc.OutTime
else CAST( CAST( datepart(yyyy, tc.OutTime ) AS varchar)
+'-'+ CAST( datepart( mm, tc.OutTime ) AS varchar)
+'-'+ CAST( datepart( dd, tc.OutTime ) AS varchar) AS DATETIME)
end as OutTime
from
TimeCard tc
where
YourDateRangeConditions...
ORDER BY
tc.EmployeeID,
TimeSplit
UNION ALL
select
tc.EmployeeID,
'2' as TimeSplit,
CAST( CAST( datepart(yyyy, tc.OutTime ) AS varchar)
+'-'+ CAST( datepart( mm, tc.OutTime ) AS varchar)
+'-'+ CAST( datepart( dd, tc.OutTime ) AS varchar) AS DATETIME)
end as InTime
tc.OutTime
from
TimeCard tc
where
YourDateRangeConditions...
AND NOT datepart( dd, tc.InTime ) = datepart( dd, tc.OutTime )