【问题标题】:SQL - return all days of last monthSQL - 返回上个月的所有天数
【发布时间】:2014-01-07 21:25:22
【问题描述】:

我有一个查询,它将返回我上个月每天收到的队列呼叫总数。如果没有电话,它将在当天返回零。但是,在运行 2013 年 12 月的此报告时,结果为空白。这似乎是由于查询返回的日期是 2014 年而不是 2013 年。如何调整查询以使日期为 12/01/2013 等。

DECLARE @pMnth int,@pYr int,@pQueue varchar
SET @pMnth = '12'
SET @pYr = '2013'
SET @pQueue = 'Queue Name'
;

WITH
CTE_Days AS
 (
 SELECT DATEADD(month, @pMnth, DATEADD(month, -MONTH(GETDATE()), DATEADD(day, -DAY(GETDATE()) + 1, CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)))) as Dt
 UNION ALL
 SELECT DATEADD(day, 1, Dt)
 FROM CTE_Days
 WHERE Dt < DATEADD(day, -1, DATEADD(month, 1, DATEADD(month, @pMnth, DATEADD(month, -MONTH(GETDATE()), DATEADD(day, -DAY(GETDATE()) + 1, CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME))))))
 )
 SELECT tbl1.Dt,ISNULL(Calls,0) AS Calls
 FROM CTE_Days tbl1

 LEFT JOIN(
SELECT CAST(clmdate AS Date) AS ClDt,COUNT(*) AS Calls
FROM dbo.tblcalls
WHERE DATEPART(yyyy,clmdate) = @pYr
      AND DATEPART(mm,clmdate) = @pMnth
      AND clmqueue = @pQueue
GROUP BY CAST(clmdate AS Date) 
) tbl2 ON tbl1.Dt = tbl2.ClDt

【问题讨论】:

    标签: sql sql-server date


    【解决方案1】:

    不确定您要对所有变量做什么,但如果您想要上个月的第一天:

    SELECT DATEADD(month, DATEDIFF(month, 0, GETDATE())-1, 0)   -- < SQL 2012
    SELECT DATEADD(day,1,EOMONTH(GETDATE(),-2))              -- SQL 2012 
    

    上个月的最后一天:

    SELECT DATEADD(day,-1,DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0))  -- < SQL 2012
    SELECT EOMONTH(GETDATE(),-1)       -- SQL 2012 
    

    在您的代码中(假设您不在 2012 年):

    DECLARE @pMnth int,@pYr int,@pQueue varchar
    SET @pMnth = '12'
    SET @pYr = '2013'
    SET @pQueue = 'Queue Name'
    ;
    WITH
    CTE_Days AS
     (
     SELECT DATEADD(month, DATEDIFF(month, 0, GETDATE())-1, 0) as Dt
     UNION  ALL
     SELECT DATEADD(day, 1, Dt)
     FROM CTE_Days
     WHERE Dt < DATEADD(day,-1,DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0))
     )
     SELECT tbl1.Dt,ISNULL(Calls,0) AS Calls
     FROM CTE_Days tbl1
    
     LEFT JOIN(
    SELECT CAST(clmdate AS Date) AS ClDt,COUNT(*) AS Calls
    FROM dbo.tblcalls
    WHERE DATEPART(yyyy,clmdate) = @pYr
          AND DATEPART(mm,clmdate) = @pMnth
          AND clmqueue = @pQueue
    GROUP BY CAST(clmdate AS Date) 
    ) tbl2 ON tbl1.Dt = tbl2.ClDt
    

    更新:

    要合并您的变量,我会将月份和年份变量更改为字符串,并将 GETDATE() 替换为日期变量:

    DECLARE @pMnth CHAR(2)
           ,@pYr CHAR(4)
           ,@pQueue VARCHAR(MAX)
           ,@dt DATE
    
    SET @pMnth = '12'
    SET @pYr = '2013'
    SET @pQueue = 'Queue Name'
    SET @dt = CAST(@pYr+RIGHT('0'+@pMnth,2)+'01' AS DATE)
    
    WITH
        CTE_Days AS
         (
         SELECT DATEADD(month, DATEDIFF(month, 0, @dt)-1, 0) as Dt
         UNION  ALL
         SELECT DATEADD(day, 1, Dt)
         FROM CTE_Days
         WHERE Dt < DATEADD(day,-1,DATEADD(month, DATEDIFF(month, 0, @dt), 0))
         )
         SELECT tbl1.Dt,ISNULL(Calls,0) AS Calls
         FROM CTE_Days tbl1
    
         LEFT JOIN(
        SELECT CAST(clmdate AS Date) AS ClDt,COUNT(*) AS Calls
        FROM dbo.tblcalls
        WHERE DATEPART(yyyy,clmdate) = @pYr
              AND DATEPART(mm,clmdate) = @pMnth
              AND clmqueue = @pQueue
        GROUP BY CAST(clmdate AS Date) 
        ) tbl2 ON tbl1.Dt = tbl2.ClDt
    

    【讨论】:

    • 感谢您的信息。我声明变量是因为这个查询实际上用于 SSRS。所以 SSRS 传入这些变量来获取数据。最终用户选择他们想要运行报告的队列、月份和年份。问题是如果他们选择任何月份和去年,现在数据不会返回。是否可以使用您提供的带有这些变量的新查询?
    • @user3170293 没问题,看到更新的答案,我会从选定的月份和年份创建一个DATE 变量,并使用它来代替GETDATE()
    猜你喜欢
    • 2015-07-02
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多