Для изменения DateTime даты он включен, использование:
SELECT DATEADD(d, DATEDIFF(d, 0, GETDATE()), 0), GETDATE()
так в вашем случае, если вы Коула использовать это, чтобы сравнить Business_Day
SELECT Case WHEN DATEADD(d, DATEDIFF(d, 0, DATEADD(hour, -3, User_Attend_Date)), 0) = Business_Day
EDIT
Вы действительно хотите использовать первый логин для любого дня для пользователя, чтобы вы могли использовать CTE для достижения этого. Я добавил столбец «ожидать» (который вы можете легко удалить), и я предполагаю, что у вас должен быть user_id для идентификации пользователей. Если да, то попробуйте:
http://sqlfiddle.com/#!3/c54b4/1
WITH AttendanceDate AS (
SELECT User_Id, User_Attend_Date, Business_Day, DATEADD(d, DATEDIFF(d, 0, DATEADD(hour, -3, User_Attend_Date)), 0) AS ActualAttendDate
FROM tblAttendance),
FirstAttendance AS (
SELECT User_Id, ActualAttendDate, MIN(User_Attend_Date) FirstLogin
FROM AttendanceDate
GROUP BY User_Id, ActualAttendDate
)
SELECT TA.User_Id, TA.User_Attend_Date, TA.Business_Day, FA.FirstLogin
FROM AttendanceDate AS TA
INNER JOIN FirstAttendance AS FA
ON TA.User_Id = FA.User_Id
AND TA.ActualAttendDate = FA.ActualAttendDate
Обратите внимание, что бросок немного лишними Сейчас: http://sqlfiddle.com/#!3/c54b4/2, и видеть его с несколькими пользователями: http://sqlfiddle.com/#!3/4f2c7/1. Конечный результат, без Expect
в качестве столбца, находится на http://sqlfiddle.com/#!3/e9e6c/1.
EDIT 2
И если вам не нужна группировка user_id, то его так просто, как (http://sqlfiddle.com/#!3/0daab/1):
WITH AttendanceDate AS (
SELECT User_Attend_Date, Business_Day, DATEADD(d, DATEDIFF(d, 0, DATEADD(hour, -3, User_Attend_Date)), 0) AS ActualAttendDate
FROM tblAttendance),
FirstAttendance AS (
SELECT ActualAttendDate, MIN(User_Attend_Date) FirstLogin
FROM AttendanceDate
GROUP BY ActualAttendDate
)
SELECT TA.User_Attend_Date, TA.Business_Day, FA.FirstLogin
FROM AttendanceDate AS TA
INNER JOIN FirstAttendance AS FA
ON TA.ActualAttendDate = FA.ActualAttendDate
Оригинал ответа (больше не актуальны на основе новая информация, объясняющая, как ожидаются ожидаемые результаты)
Полный (http://sqlfiddle.com/#!3/fa5bb/10)):
SELECT User_Attend_Date, DATEADD(hour, -3, User_Attend_Date),
DATEADD(d, DATEDIFF(d, 0, DATEADD(hour, -3, User_Attend_Date)), 0) AS 'ForClarity1',
CAST(DATEADD(d, DATEDIFF(d, 0, DATEADD(hour, -3, User_Attend_Date)), 0) AS DATE) AS 'ForClarity2',
Business_Day AS 'ForClarity3',
Case WHEN
CAST(DATEADD(d, DATEDIFF(d, 0, DATEADD(hour, -3, User_Attend_Date)), 0) AS DATE) = Business_Day
THEN User_Attend_Date ELSE Business_Day END As 'Check_Same_Day'
FROM dbo.tblAttendance
Если значения в «рабочий день» - это только часть дня года «user_attend_date», то столбцы являются избыточными и не нужны. Что вы действительно хотите найти? – mikeY
Я не могу понять ваши ожидаемые результаты; как вторая строка '2013-05-02 00: 00: 00.000, 2013-05-01' стать' 2013-05-01 15: 18: 45.537' –
Это потому, что сотрудники могут пройти регистрацию дважды. Поэтому я необходимо за минусом 3 часа проверить, работает ли персонал в тот же рабочий день. В тот же рабочий день, будет использовать первое время регистрации в качестве Check_Same_Day. Это требование моего клиента. Спасибо –