SQL 每个日期的服务器 CTE
SQL Server CTE For Each Date
我被困在这个时候,我需要为我的项目中的屏幕获取报告。
用户输入的是开始日期和结束日期...
在这些值之间的每一天,我都需要 "closed task count"。如果某些日期没有任务,计数应该 return "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'
*/
结果就像,我有连续的所有日期,但值(计数)全为零。
干杯。
我观察到您在第一个查询中将 TASK_CLOSING_DATE
转换为日期时间,但在使用 BETWEEN
时却没有。我看到一些数据类型不匹配。请在加入 CTE 时尝试转换。
编辑:根据 OP 的反馈,问题在于日期和日期时间字段的转换。
OP 的评论: 将我的 DATETIME 转换为 DATE 完全解决了这个问题
我被困在这个时候,我需要为我的项目中的屏幕获取报告。
用户输入的是开始日期和结束日期... 在这些值之间的每一天,我都需要 "closed task count"。如果某些日期没有任务,计数应该 return "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'
*/
结果就像,我有连续的所有日期,但值(计数)全为零。
干杯。
我观察到您在第一个查询中将 TASK_CLOSING_DATE
转换为日期时间,但在使用 BETWEEN
时却没有。我看到一些数据类型不匹配。请在加入 CTE 时尝试转换。
编辑:根据 OP 的反馈,问题在于日期和日期时间字段的转换。 OP 的评论: 将我的 DATETIME 转换为 DATE 完全解决了这个问题