2013-06-04 4 views
-1

я следующие данные в моей посещаемости таблице:Проверить тот же день в таблице

Staff_ID |  User_Attend_Date | Business_Day 
    S01  | 2013-05-01 15:18:45.537 | 2013-05-01 
    S01  | 2013-05-02 00:00:00.000 | 2013-05-01 
    S02  | 2013-05-03 06:20:30.225 | 2013-05-02 

Я хочу, чтобы отобразить новый столбец проверить, является ли персонал регистрация дата минус 3 часа в тот же день, как дата бизнеса. Если же, как рабочий день, по-прежнему User_Attend_Date.My тип данных для Business_Day является DATE, другая 2 колонка DATETIME.The результат должен, как показано ниже:

Staff_ID |  User_Attend_Date | Business_Day |  Check_Same_Day 
    S01  | 2013-05-01 15:18:45.537 | 2013-05-01 | 2013-05-01 15:18:45.537 
    S01  | 2013-05-02 00:00:00.000 | 2013-05-01 | 2013-05-01 15:18:45.537 
    S02  | 2013-05-03 06:20:30.225 | 2013-05-02 | 2013-05-03 06:20:30.225 

Я стараюсь следующий код, но не для достижения результата.

SELECT *, Case WHEN DATEADD(hh, -3, User_Attend_Date)=Business_Day 
THEN User_Attend_Date ELSE BusinessDay END As 'Check_Same_Day' FROM tblAttendance 

Я попытался использовать раздел, но тоже не смог.

DATEADD(hh, -3, User_Attend_Date) OVER (PARTITION BY BusinessDay) AS 'Check_Same_Day' 

Надежда кто-то может научить me.thanks

+0

Если значения в «рабочий день» - это только часть дня года «user_attend_date», то столбцы являются избыточными и не нужны. Что вы действительно хотите найти? – mikeY

+0

Я не могу понять ваши ожидаемые результаты; как вторая строка '2013-05-02 00: 00: 00.000, 2013-05-01' стать' 2013-05-01 15: 18: 45.537' –

+0

Это потому, что сотрудники могут пройти регистрацию дважды. Поэтому я необходимо за минусом 3 часа проверить, работает ли персонал в тот же рабочий день. В тот же рабочий день, будет использовать первое время регистрации в качестве Check_Same_Day. Это требование моего клиента. Спасибо –

ответ

2

Для изменения 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 
+0

Я запускаю запрос в sqlfiddle, но Check_Same_Day для второй записи - «2013-05-02 00: 00: 00.000», предположим, это «2013-05-01 15: 18: 45.537». Спасибо –

+0

@HowardHee. Я обновил новое редактирование вверху, это использует CTE и будет работать для вас. –

+0

@HowardHee. И в случае, если я неправильно понял, и у вас нет столбца userId (вы не делаете этого для каждого пользователя), то я добавил второе редактирование без столбца userId. –

0

Я вижу два варианта:

1) DATEDIFF:

SELECT Case WHEN datediff(day,DATEADD(hh, -3, User_Attend_Date),Business_Day) < 1 
THEN User_Attend_Date ELSE BusinessDay END As 'Check_Same_Day' FROM tblAttendance 

2) В ролях:

SELECT Case WHEN Cast(DATEADD(hh, -3, User_Attend_Date) as Date) = Business_Day 
THEN User_Attend_Date ELSE BusinessDay END As 'Check_Same_Day' FROM tblAttendance 
0

Вы почти там, проблема в том, что вам необходимо преобразовать результат DATEADD в DATE (вместо DATETIME):

DECLARE @att TABLE 
(
    User_Attend_Date DATETIME, 
    Business_Day DATE 
) 

INSERT INTO @att 
SELECT '2013-05-01 15:18:45.537', '2013-05-01' 
UNION ALL 
SELECT '2013-05-02 00:00:00.000', '2013-05-01' 
UNION ALL 
SELECT '2013-05-03 06:20:30.225', '2013-05-02' 

SELECT 
    User_Attend_Date, 
    Business_Day, 
    CASE 
     WHEN CAST(DATEADD(hh, -3, User_Attend_Date) AS DATE) = Business_Day THEN User_Attend_Date 
     ELSE Business_Day 
    END AS 'Check_Same_Day' 
FROM @att 

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

0

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

SELECT 
     *, 
     CASE WHEN CAST(DATEADD(HOUR,-4,User_Attend_Date) AS DATE)=Business_Day 
     THEN User_Attend_Date 
     ELSE Business_Day 
     END AS Check_Same_Day 
     FROM #test 
0

Я думаю, что это отображение секунд значения в строке, потому что НУ иметь тип данных DATE для Bussiness_day и тип данных DATETIME для другого столбца.

Возможно ли использовать тип данных DATE в sql 2008?

0
 
SELECT USER_ATTEND_DATE,SUBSTRING(CAST(BUSINESS_DAY AS VARCHAR(20)),0,13)AS BUSINESS_DAY, 

     CASE 
      WHEN DATEADD(hh, -3, User_Attend_Date) = Business_Day 
      THEN Business_Day 
      ELSE DATEADD(hh, -3, User_Attend_Date) 
     END CHECK_SAME_DAY 
FROM attendance