2015-05-18 151 views
0

我正在寫一個小查詢,它可以建立每月行數&年,以模仿您在Google Analytics中看到的行爲。按日期範圍篩選的mssql

這是我的查詢:

USE MyDatabase; 

SELECT 
    COUNT(*) AS Rows, 
    DATENAME(mm, OpenDate) AS Month, 
    DATENAME(yyyy, OpenDate) AS Year 
FROM MyTable 
WHERE Priority = 1 
GROUP BY DATENAME(mm, OpenDate), DATENAME(yyyy, OpenDate) 
ORDER BY Year, Month DESC; 

我不清楚,我怎麼會在這個查詢申請的日期範圍過濾器。

  1. 我應該用HAVING還是WHERE
  2. 我需要爲我的變量使用完全形成的日期時間字符串嗎?或者我是按年份和月份分別過濾的,因爲我有這些列?
+0

WHERE OpenDate> = @ Date1和OpenDate <= @ Date2'?這不正常嗎? – Taryn

+0

因爲他使用的是GROUP BY,所以我期望:'具有OpenDate BETWEEN @ Date1和@ Date2'會起作用。 – SQLHound

+0

謝謝,你們倆。但我應該爲'date1'和'date2'變量填入完整的日期時間字符串嗎? – Kristian

回答

2

由於@bluefeet說,這應該一般工作來說:

WHERE OpenDate >= @Date1 and OpenDate <= @Date2 

我應該使用具有或WHERE?

其中。

HAVING是分組和彙總後,篩選出,所以一個好的經驗法則是,只有當你需要參考聚集函數像HAVING COUNT(*) > 10或類似使用它。另外,請記住,HAVING子句中的每個字段也必須位於GROUP BY或聚合中。它會在這裏工作,但避免HAVING的邏輯更好,除非你知道你需要它。通常,您可以越早過濾出數據集中的內容,處理得越快,並且在GROUP BY之前處理WHERE。

我是否需要爲我的變量使用完全形成的日期時間字符串?或者我是按年份和月份分別過濾的,因爲我有這些列?

通常情況下最容易做出完整的日期或日期時間。你會在某個時候跨越年界,如果你不這樣做,那將會是一個巨大的痛苦。如果你想要2014年11月到2015年1月怎麼辦?或者2013年5月至2015年5月?


您需要決定的唯一事情是如果或如何合計小數月份。那麼,應用程序是否允許用戶說他們想要2014年6月23日至2014年7月13日?

如果他們這樣做,你是否會返回,還是你在六月和七月回覆一切,並忽略他們選擇了具體日期的事實?

如果是前者,那麼@ bluefeet的答案是罰款:

WHERE OpenDate >= @Date1 and OpenDate <= @Date2 

如果沒有,那麼你可能需要修改日期標準。通常情況下,你會想說:

WHERE OpenDate >= {First Date Of Date1's Month} 
    AND OpenDate < {First Date of Month After Date2 Month} 

所以,如果你想從2014年6月23日至2015年1月13日,將是這樣的:

WHERE OpenDate >= '2014-06-01' 
    AND OpenDate < '2015-01-01' 

否則像這意味着你不不得不擔心一個月有多少天。您甚至可以在將應用程序提交給查詢引擎之前處理日期數學運算,但可以使用CAST(),YEAR(),MONTH()和DATEADD()在SQL中完成。

3

或者,你也可以投你的時間字段(Opendate裏),以日期和做這樣的事情:

USE MyDatabase; 

DECLARE @StartDate DATE 
    ,@EndDate DATE 

SET @StartDate = '2015-05-01' 
SET @EndDate = '2015-05-30' 

BEGIN 
    SELECT COUNT(*) AS Rows 
     ,DATENAME(mm, OpenDate) AS Month 
     ,DATENAME(yyyy, OpenDate) AS Year 
    FROM MyTable 
    WHERE Priority = 1 
     AND CAST(OpenDate AS DATE) BETWEEN @StartDate 
      AND @EndDate 
    GROUP BY DATENAME(mm, OpenDate) 
      ,DATENAME(yyyy, OpenDate) 
    ORDER BY Year,Month DESC; 
END 

WHERE VS HAVING?

WHERE子句在執行聚合之前限制數據,而HAVING子句在執行聚合之後限制數據。

使用WHERE子句總是更好,因爲不需要讓計算機計算聚合並將其過濾掉。