2015-03-25 55 views
0

我在SELECT查詢與GROUP BYDATEADD一個問題,它是這樣的:(見下文樣本SQL代碼)SQL服務器:GROUP BY和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.

任何替代和建議大加讚賞。謝謝!

編輯: 順便說一句,我使用的是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 2015-03-25 08:19:19

+0

'03/08/2014'來自'LogDate'嗎?你如何確定? – NickyvV 2015-03-25 08:23:41

+0

** 03/08/2014 **是LOGDATE的實際日期(尚未減去15),但我希望將GROUP BY LOGDATE列減去15 – Waelhi 2015-03-25 08:28:46

回答

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列的錯誤。請參閱上面更新後的文章以獲取期望的輸出 – Waelhi 2015-03-25 08:31:44

+0

你得到的錯誤是什麼? – 2015-03-25 08:34:26

+0

@Waelhi看到我編輯的答案。我已經爲解決問題的內部查詢添加了別名。 http://sqlfiddle.com/#!6/7ad95/3 – 2015-03-25 08:54:31

0

在查詢的GROUP BY子句中,將

DATEADD(hh,-15,log_date) 

tblDTR.log_date 
+0

請參閱上面更新後的文章以獲取期望的輸出。 – Waelhi 2015-03-25 08:32:10

+0

@Waelhi:您在查詢中使用的** [LogDate] **的轉換語句將爲您提供所需的日期格式(即02/08/2014)。但只要確保在您的** GROUP BY **子句中添加log_date列即可擺脫此錯誤。 – Cylar 2015-03-25 08:45:01