-1

我想在 sql 中查找从 25-08-2012 到 01-09-2012 的记录,我想按日期分组

这是我的查询

SELECT CONVERT(VARCHAR(10), date, 105) AS dt,
COUNT(id) AS cnt
FROM tablename
WHERE date BETWEEN CONVERT(DATETIME, '21-08-2012 00:00:00:000',103)
AND CONVERT(DATETIME, '01-09-2012 23:59:00:000' ,103)
GROUP BY CONVERT(VARCHAR(10), date, 105)

我得到的结果是

dt                 cnt
01-09-2012         48
27-08-2012         1
28-08-2012         3
29-08-2012         11
30-08-2012         3

但期待它

dt                 cnt
25-08-2012          0
26-08-2012          0
01-09-2012          48
27-08-2012          1
28-08-2012          3
29-08-2012         11
30-08-2012          3

我如何修改上面的查询我也尝试过 CASE 但没有运气

非常感谢..

4

3 回答 3

3

结果中缺少这些日期的原因是表中没有它们的数据,但是,以下内容将确保您获得指定范围内的所有日期:

CREATE TABLE #tmp_dates ([date] datetime)  

DECLARE @dt_start datetime, @dt_end datetime, @dt_dif int  

SET @dt_start = CONVERT(DATETIME, '21-08-2012 00:00:00:000',103) 
SET @dt_end = CONVERT(DATETIME, '01-09-2012 23:59:00:000' ,103)  
SET @dt_dif = datediff(day,@dt_start,@dt_end)  

WHILE @dt_dif >= 0 BEGIN 
INSERT INTO #tmp_dates 
SELECT dateadd(day,@dt_dif,@dt_start) 
SET @dt_dif = @dt_dif - 1 
END  

SELECT CONVERT(VARCHAR(10), t2.[date], 101) AS dt,  COUNT(t1.id) AS cnt 
INTO #tmp_result 
FROM tablename t1  
RIGHT OUTER JOIN #tmp_dates t2  
ON CONVERT(VARCHAR(10), t1.[date], 101) = CONVERT(VARCHAR(10), t2.[date], 101) 
GROUP BY CONVERT(VARCHAR(10), t2.[date], 101)   
ORDER BY CONVERT(DATETIME,CONVERT(VARCHAR(10), t2.[date], 101)) ASC /* DESC */

SELECT convert(VARCHAR(10),CONVERT(DATETIME,dt),105) as dt,cnt FROM #tmp_result

DROP TABLE #tmp_dates 
DROP TABLE #tmp_result
于 2012-09-04T16:15:00.617 回答
2

不能直接修改您的查询以返回您想要的数据。要计算有问题的日期,目标表中必须有实际具有这些日期的记录;但是,在您的情况下,日期只是查询中的参数。因此,无法将它们合并到您的结果集中。

您必须创建一个辅助表,其中包含您需要数据的所有日期,然后将您的查询重新定义为从该日期表到目标表的左外连接。反过来,这将为您提供“日期”表中存在但目标表中不存在的日期的零计数。

于 2012-09-04T15:59:03.740 回答
0

怎么用IsNull()?让我知道这个是否奏效。

SELECT CONVERT(VARCHAR(10), date, 105) AS dt,
ISNULL(COUNT(id),0) AS cnt
FROM tablename
WHERE date BETWEEN CONVERT(DATETIME, '21-08-2012 00:00:00:000',103)
AND CONVERT(DATETIME, '01-09-2012 23:59:00:000' ,103)
GROUP BY CONVERT(VARCHAR(10), date, 105)
于 2012-09-04T16:04:20.133 回答