2014-01-17 345 views
1

我試圖檢索某個日期範圍內特定於用戶最小日期和最大日期的另一個表中的記錄數。SQL日期範圍

這是我到目前爲止,但它是至少排除我記錄的13條記錄。你能告訴我的邏輯是否有錯誤嗎?

在此先感謝您的任何意見!

SELECT rtam.dbo.wfm_process_instance.user_id AS user_id, 
     MIN(rtam.dbo.wfm_process_instance.LOCAL_USER_START_TIME) AS Min_Date, 
     MAX(rtam.dbo.wfm_process_instance.LOCAL_USER_START_TIME) AS Max_Date, 
     0 AS IVR_Calls, 
     COUNT(*) AS Total_Calls 
FROM  rtam.dbo.WFM_PROCESS_INSTANCE 
     LEFT OUTER JOIN 
     rtam.dbo.WFM_PROCESS_type 
     ON rtam.dbo.wfm_process_instance.PROCESS_TYPE_INDX = rtam.dbo.wfm_process_type.INDX 
WHERE rtam.dbo.wfm_process_type.DISPLAY_NAME = 'DTV Inbound2' 
     AND EXISTS (SELECT rtam.dbo.gnr_Tbl_72_type.CTRL_USER_ID, 
           CONVERT (VARCHAR (10), MIN(rtam.dbo.gnr_tbl_72_type.LOCAL_COL_113), 101) AS min_date, 
           CONVERT (VARCHAR (10), MAX(rtam.dbo.gnr_tbl_72_type.local_col_113), 101) AS max_date 
        FROM  rtam.dbo.GNR_TBL_72_TYPE 
        WHERE rtam.dbo.GNR_TBL_72_TYPE.CTRL_USER_ID = rtam.dbo.wfm_process_instance.USER_ID 
        GROUP BY rtam.dbo.GNR_TBL_72_TYPE.CTRL_USER_ID 
        HAVING rtam.dbo.wfm_process_instance.LOCAL_USER_START_TIME BETWEEN CONVERT (VARCHAR (10), MIN(rtam.dbo.gnr_tbl_72_type.LOCAL_COL_113), 101) AND CONVERT (VARCHAR (10), MAX(rtam.dbo.gnr_tbl_72_type.LOCAL_COL_113), 101)) 
GROUP BY rtam.dbo.wfm_process_instance.USER_ID 
ORDER BY rtam.dbo.wfm_process_instance.USER_ID; 
+6

那麼你期望BETWEEN是什麼意思?它看起來像是由於某種原因轉換爲字符串 - 這是爲了消除時間?如果是這樣,我敢打賭,失蹤的13行是來自最後一天?請閱讀[this](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx)和[this](http ://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in-common.aspx)。 –

+0

與Huh先生一樣Bertrand先生,甚至可以開始弄清楚是什麼讓你選擇存在的子查詢中的日期,沒關係轉換它們.. –

+0

你需要考慮在函數中包裝列會阻止SQL服務器能夠使用索引並使查詢更慢。就像@AaronBertrand說的,澄清你在這裏要做的事情。 – 2014-01-17 21:04:10

回答

2

嘗試:

HAVING rtam.dbo.wfm_process_instance.LOCAL_USER_START_TIME 
    >= CONVERT(DATE, MIN(rtam.dbo.gnr_tbl_72_type.LOCAL_COL_113)) 
AND rtam.dbo.wfm_process_instance.LOCAL_USER_START_TIME 
    < DATEADD(DAY, 1, CONVERT(DATE, MAX(rtam.dbo.gnr_tbl_72_type.LOCAL_COL_113)) 

你也可以考慮使用別名,以便您不必在你的代碼重複像rtam.dbo.wfm_process_instance冗長且容易出錯的引用。

+0

你好!是的,工作!當我回家時,我會在今晚的兩張桌子上張貼一些樣本數據。謝謝! :) –