2015-03-25 2 views
0

У меня есть проблема в моем SELECT запросе с GROUP BY и DATEADD, и это выглядит следующим образом: (см пример кода SQL ниже)SQL Server: группа по и DATEADD путаница

SELECT 
    'USER1' AS [user_id], 
    DATEADD(hh,-15,log_date) AS [LogDate], 
    MIN(DATEADD(hh,-15,login_time)) AS [Login], 
    MAX(DATEADD(hh,-15,logout_time)) AS [Logout], 
    DATEDIFF(MINUTE,MIN(DATEADD(hh,-15,login_time)), 
    MAX(DATEADD(hh,-15,logout_time)))/60.0 AS [TotalHrs] 
FROM 
    tblDTR 
WHERE 
    user_id = 'USER1' 
    AND log_date BETWEEN CAST('02/07/2014' AS datetime) 
        AND CAST('02/28/2014' AS datetime) 
GROUP BY 
    user_id, 
    DATEADD(hh, -15, log_date) 
ORDER BY 
    LogDate ASC 

и это результат:

enter image description here

То, что я хочу сделать, это LogDate столбец должен отображать РЕАЛЬНОГО ДАТА & ВРЕМЯ (это означает, что столбец не должен быть вычтен до -15), а также, как вы можете видеть в таблице результатов выше на столбце LogDate, хотя я использовал GROUP BY DATEADD(hh, -15, log_date), он вообще не работал. Я пропустил какую-то функцию по моему SQL-коду?

Вот мой новый SQL-код для отображения LogDate без вычитают 15:

SELECT 
    'USER1' AS [user_id], 
    CONVERT(varchar,log_date,101) AS [LogDate], <-- I changed here but it didn't work, it give me error. 
    MIN(DATEADD(hh, -15, login_time)) AS [Login], 
    MAX(DATEADD(hh, -15, logout_time)) AS [Logout], 
    DATEDIFF(MINUTE, MIN(DATEADD(hh, -15, login_time)), 
    MAX(DATEADD(hh, -15, logout_time)))/60.0 AS [TotalHrs] 
FROM 
    tblDTR 
WHERE 
    user_id = 'USER1' 
    AND log_date BETWEEN CAST('02/07/2014' AS datetime) 
        AND CAST('02/28/2014' AS datetime) 
GROUP BY 
    user_id, 
    DATEADD(hh, -15, log_date) 
ORDER BY 
    LogDate ASC 

Ошибка:

Msg 8120, Level 16, State 1, Line 3
Column 'tblDTR.log_date' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Любые альтернативные и предложения очень ценятся. Благодаря!

EDIT: BTW, я использую SQL Server 2012

ВЫХОД ДОЛЖЕН БЫТЬ:

------------------------------------------------------------------------- 
| user_id | LogDate |  Login  |  LogOut  | TotalHrs | 
------------------------------------------------------------------------- 
| USER1 | 02/07/2014 | 2014-02-07 08:12 | 2014-02-07 19:30 | 11.28 | 
------------------------------------------------------------------------- 
+0

Вы говорите, 'группа by' не работает .. Это работает, но я подозреваю, что вы хотите, чтобы сгруппировать дни вместе? Сначала вам нужно преобразовать 'log_date' в тип данных' DATE', потому что теперь это 'DATETIME', он группируется по каждому отдельному дате в этом столбце. И почему вы на самом деле вычитаете 15 часов? – NickyvV

+0

Откуда появляется '03/08/2014' в' LogDate'? Как вы это определяете? – NickyvV

+0

** 03/08/2014 ** - это РЕАЛЬНАЯ ДАТА LOGDATE (еще не вычитана до 15), но я хочу «GROUP BY» LOGDATE Колонка к тому времени, когда она вычитается до 15 – Waelhi

ответ

1

Вы можете просто обернуть ваш выбор с другой, добавляя обратно 15 часов :

SELECT [user_id], 
    DATEADD(hh, 15 ,LogDate) AS [LogDate], 
    [Login], 
    [Logout], 
    [TotalHrs] 
FROM (
    SELECT 
    'USER1' AS [user_id], 
    DATEADD(hh,-15,log_date) AS [LogDate], 
    MIN(DATEADD(hh,-15,login_time)) AS [Login], 
    MAX(DATEADD(hh,-15,logout_time)) AS [Logout], 
    DATEDIFF(MINUTE,MIN(DATEADD(hh,-15,login_time)), 
        MAX(DATEADD(hh,-15,logout_time)))/60.0 AS [TotalHrs] 
    FROM tblDTR 
    WHERE user_id = 'USER1' 
     AND log_date 
      BETWEEN CAST('02/07/2014' AS datetime) 
       AND CAST('02/28/2014' AS datetime) 
    GROUP BY 
     user_id, 
     DATEADD(hh,-15,log_date) 
) InnerQueryAlias 
    ORDER BY LogDate ASC 
+0

Я получаю ошибку в первых SELECTed Columns. Пожалуйста, см. Обновленный пост выше для желаемого вывода. – Waelhi

+0

Какая ошибка вы получаете? –

+0

@Waelhi См. Мой отредактированный ответ. Я добавил псевдоним внутреннего запроса, который решил проблему. http://sqlfiddle.com/#!6/7ad95/3 –

0

В предложении GROUP BY вашего запроса заменить

DATEADD(hh,-15,log_date) 

с

tblDTR.log_date 
+0

Пожалуйста, см. обновленное сообщение выше для желаемого вывода. – Waelhi

+0

@Waelhi: Оператор преобразования для ** [LogDate] **, который вы используете в своем запросе, даст вам желаемый формат даты (то есть 02/08/2014). Но просто убедитесь, что вы добавляете столбец log_date в свое предложение ** GROUP BY **, чтобы избавиться от ошибки. – Cylar

Смежные вопросы