У меня есть проблема в моем 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
и это результат:
То, что я хочу сделать, это 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 |
-------------------------------------------------------------------------
Вы говорите, 'группа by' не работает .. Это работает, но я подозреваю, что вы хотите, чтобы сгруппировать дни вместе? Сначала вам нужно преобразовать 'log_date' в тип данных' DATE', потому что теперь это 'DATETIME', он группируется по каждому отдельному дате в этом столбце. И почему вы на самом деле вычитаете 15 часов? – NickyvV
Откуда появляется '03/08/2014' в' LogDate'? Как вы это определяете? – NickyvV
** 03/08/2014 ** - это РЕАЛЬНАЯ ДАТА LOGDATE (еще не вычитана до 15), но я хочу «GROUP BY» LOGDATE Колонка к тому времени, когда она вычитается до 15 – Waelhi