2015-05-18 188 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子句总是更好,因为不需要让计算机计算聚合并将其过滤掉。