【发布时间】:2015-08-16 10:48:58
【问题描述】:
我被困在需要为我的项目中的屏幕获取报告的地方。
用户输入的是开始日期和结束日期... 我需要这些值之间每天的“关闭任务计数”。如果某些日期没有任务,则计数应返回“0”。到目前为止,我在这里,但我真的不明白我做错了什么。请帮忙!
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
ALTER PROCEDURE APP.GET_TASK_ENTRY_ACTIVE_GRAPH
(
@START_DATE DATETIME,
@END_DATE DATETIME
)
AS
BEGIN
SET NOCOUNT ON
CREATE TABLE #TMP_TASK_VALS
(
DATE_VALUE DATETIME,
VAL INT
)
INSERT INTO #TMP_TASK_VALS
(
DATE_VALUE, VAL
)
SELECT CONVERT(DATETIME, TASK_CLOSING_DATE), COUNT(1) FROM APP.TASK_ENTRIES (NOLOCK)
WHERE TASK_CLOSING_DATE BETWEEN @START_DATE AND @END_DATE
GROUP BY TASK_CLOSING_DATE
--ORDER BY TASK_CLOSING_DATE DESC
--SELECT * FROM #TMP_TASK_VALS
;WITH CTE_DAILY(DAY) AS
(
SELECT @START_DATE AS DAY
UNION ALL
SELECT DAY + 1 FROM CTE_DAILY
WHERE DAY < @END_DATE
)
SELECT CTE_DAILY.DAY, COUNT(VAL) FROM CTE_DAILY WITH (NOLOCK) LEFT JOIN #TMP_TASK_VALS WITH (NOLOCK) ON #TMP_TASK_VALS.DATE_VALUE = CTE_DAILY.DAY
GROUP BY CTE_DAILY.DAY
DROP TABLE #TMP_TASK_VALS
END
GO
/*
exec APP.GET_TASK_ENTRY_ACTIVE_GRAPH '2015-08-10', '2015-08-16'
*/
结果就像,我有所有的日期连续,但值(计数)全为零。
干杯。
【问题讨论】:
-
@mxix 我没有得到 NULL 值,我得到 0。这有什么帮助?
-
您是否检查过您是否在临时表中获取值?
-
奇怪..我观察到您在第一次查询中将 TASK_CLOSING_DATE 转换为日期时间,但在使用 BETWEEN 时却没有。加入 CTE 时您也可以尝试转换吗?
-
@DarkKnight 上帝保佑你,伙计啊!发现了问题,我实际上是在将我的日期值转换为 DATETIME,它应该只是 DATE,所以我用
CONVERT(DATE, TASK_CLOSING_DATE)phew 修复了它!干杯!!!!!! -
我会添加这个作为答案。如果你觉得可以,请接受。
标签: sql-server stored-procedures recursion left-join common-table-expression