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;
那麼你期望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)。 –
與Huh先生一樣Bertrand先生,甚至可以開始弄清楚是什麼讓你選擇存在的子查詢中的日期,沒關係轉換它們.. –
你需要考慮在函數中包裝列會阻止SQL服務器能夠使用索引並使查詢更慢。就像@AaronBertrand說的,澄清你在這裏要做的事情。 – 2014-01-17 21:04:10