2014-01-17 5 views
1

Я пытаюсь получить счетчик записей между определенным диапазоном дат, который определен для даты пользователя min и даты max в другой таблице.SQL HAVING BETWEEN диапазон дат

Это то, что у меня есть до сих пор, однако оно исключает, по крайней мере, 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

Ну что именно вы ожидаете МЕЖДУ МЕЖДУ? Похоже, вы почему-то конвертируете в строку - это для устранения времени? Если да, я уверен, что 13 строк, которые отсутствуют, относятся к последнему дню? Пожалуйста, прочитайте [это] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx) и [это] (http : //sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in-common.aspx). –

+0

То же, что и в качестве г-на Бертранда, может даже начать выяснять, что заставило вас выбрать даты в существующем подзапросе, не обращая на них никакого внимания. –

+0

Вам нужно учитывать, что перенос столбца в функцию предотвратит возможность использования SQL-сервера использовать индексы и сделать ваш запрос медленнее. и точно так же, как @AaronBertrand сказал, уточните, что вы пытаетесь сделать здесь. –

ответ

2

Try:

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

Привет! Да, это сработало! Я отправлю некоторые образцы данных из обеих таблиц этим вечером, когда вернусь домой. Благодаря! :) –

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