简体   繁体   English

SQL - 返回上个月的所有日子

[英]SQL - return all days of last month

I have a query that will return the total number of calls I received each day of last month for a queue. 我有一个查询,它将返回我上个月每天收到的队列调用总数。 if no calls it will return zero for that day. 如果没有电话,它将在当天返回零。 However when running this report for for December of 2013 the results are blank. 但是,在2013年12月运行此报告时,结果为空。 It appears to be due to the fact the query is returning the dates with the year of 2014 instead of 2013. How can I adjust the query so the date is 12/01/2013, etc. 这似乎是由于查询返回的日期是2014年而不是2013年。如何调整查询以使日期为2013年1月12日等。

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

Not really sure what you're trying to do with all the variables, but if you want the first day of last month: 不确定你要对所有变量做什么,但如果你想要上个月的第一天:

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

Last day of last month: 上个月的最后一天:

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

In your code (assuming you're not on 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

Update: 更新:

To incorporate your variables, I would change the month and year variables to strings, and replace GETDATE() with a date variable: 要合并您的变量,我会将月份和年份变量更改为字符串,并将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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM