簡體   English   中英

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

[英]SQL - return all days of last month

我有一個查詢,它將返回我上個月每天收到的隊列調用總數。 如果沒有電話,它將在當天返回零。 但是,在2013年12月運行此報告時,結果為空。 這似乎是由於查詢返回的日期是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

不確定你要對所有變量做什么,但如果你想要上個月的第一天:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM