【问题标题】:SQL Server CTE For Each Date每个日期的 SQL Server CTE
【发布时间】: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


【解决方案1】:

我观察到您在第一次查询中将TASK_CLOSING_DATE 转换为日期时间,但在使用BETWEEN 时没有。我看到一些数据类型不匹配。请在加入 CTE 的同时尝试转换。

编辑:根据 OP 的反馈,问题在于日期和日期时间字段的转换。 OP 的评论:将我的 DATETIME 转换为 DATE 完全解决了这个问题

【讨论】:

  • 将我的 DATETIME 转换为 DATE 完全解决了这个问题。感谢您的帮助,这基本上是一个日期时间问题。干杯!
  • 很高兴知道。干杯伙伴!
猜你喜欢
  • 2018-04-13
  • 2017-09-01
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
相关资源
最近更新 更多