[英]mssql filter by date range
我正在寫一個小查詢,它建立每月/每年的行數,以模仿您在Google Analytics(分析)中看到的行為。
這是我的查詢:
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;
我不清楚如何在此查詢中應用日期范圍過濾器。
HAVING
還是WHERE
? 另外,您也可以將日期時間字段(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
子句在執行聚合之前限制數據,而HAVING
子句在執行聚合之后限制數據。
使用WHERE
子句總是更好,因為不需要讓計算機計算聚合然后將其過濾掉。
正如@bluefeet所說,一般來說,這應該可以工作:
WHERE OpenDate >= @Date1 and OpenDate <= @Date2
我應該使用HAVING還是WHERE?
哪里。
HAVING用於在分組和聚合之后進行過濾,因此一個很好的經驗法則是,僅在需要引用諸如HAVING COUNT(*) > 10
或類似內容之類的聚合函數時才使用它。 另外,請記住,HAVING子句中的每個字段也必須位於GROUP BY或集合中。 它可以在這里工作,但是最好避免使用HAVING,除非您知道自己需要它。 通常,您可以越早地從數據集中過濾掉內容,處理越快,並且在GROUP BY之前進行WHERE處理。
我需要為我的var使用格式完整的datetime字符串嗎? 還是自從擁有這些列以來我分別按年和月過濾?
形成完整的日期或日期時間通常最容易。 您將在某個時候跨越年度界限,如果不這樣做,可能會非常痛苦。 如果要從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中完成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.