2017-06-01 123 views
0

下表列出了一個表中的出席人數。每個月我都需要根據從20 /上個月開始的截止期 - 19 /當月來監控出勤率。SQL自動截斷期間日期

Date  Branch  Attendance 
13/04/2017 Branch A   5 
14/04/2017 Branch A   5 
22/04/2017 Branch A   5 
30/04/2017 Branch A   5 
17/05/2017 Branch A   6 
18/05/2017 Branch A   6 
01/04/2017 Branch B   17 
15/04/2017 Branch B   14 
20/04/2017 Branch B   14 
19/05/2017 Branch B   17 
20/05/2017 Branch B   15 
25/05/2017 Branch B   17 

例如;我想在五月份展示,截止時間爲20/4/2017至19/5/2017。 下面是我的代碼:

SELECT 
    CONVERT(VARCHAR,Date,103) AS Date, 
    Branch, 
    Attendance 
FROM 
    Table_attd 
WHERE 
    Date>=DATEADD(DAY,(SELECT DATEDIFF (DAY,(DATEADD(DAY,0,GETEDATE())), 
     (DATEADD(MONTH,-1,CONVERT(DATETIME,CAST(YEAR(GETDATE()) AS 
     VARCHAR)+'/'+CAST(MONTH(GETDATE()) AS 
     VARCAHR)+'/'+'19',102))))),GETDATE()) 
     AND Date<=DATEADD(DAY,-1,GETDATE()) 

結果:

Date  Branch Attendance 
22/04/2017 Branch A 5 
30/04/2017 Branch A 5 
17/05/2017 Branch A 6 
18/05/2017 Branch A 6 
20/04/2017 Branch B 14 
19/05/2017 Branch B 17 

但我意識到,我的代碼有漏洞,其中,當君月份(截止期爲20/5/2017 - 19/6/2017),結果將不正確。 請建議 - 謝謝!

回答

0

您的查詢不是正確的語法,您可以使用此

DECLARE @CurrentDate date = getdate() 
DECLARE @20PreviousMonth date = dateadd(day,19,dateadd(month,datediff(month,0,@CurrentDate) - 1,0)) 
DECLARE @19CurrentMonth date = dateadd(day,18,dateadd(month,datediff(month,0,@CurrentDate) ,0)) 

SELECT 
    CONVERT(VARCHAR,[Date],103) AS Date, 
    Branch, 
    Attendance 
FROM 
    Table_attd 
WHERE 
    [Date] BETWEEN @20PreviousMonth AND @19CurrentMonth 
0
...where [date] between dateadd(day, 19, dateadd(month, -1, cast(convert(char(6), getdate(), 112) + '01' as date))) 
and dateadd(day, 18, cast(convert(char(6), getdate(), 112) + '01' as date)) 
0

的另一種方式來解決這個問題是創建一個「日期」表。

Date  CalendarMonth ReportingMonth 
2017-19-05 May   May  
2017-20-05 May   June 

然後,只需將此表格與'ReportingMonth'組合成您的事實表和組。這使您可以快速調用任何時間段的數據,並允許在切換日期內保持靈活性。

0

或者你可以試試這個。

 DECLARE @previous DATETIME = CAST(DATEADD(DAY, 
                (DATEDIFF(DAY, 
                  (DATEADD(DAY, 0, 
                  GETDATE())), 
                  (DATEADD(MONTH, 
                  -1, 
                  CONVERT(DATETIME, CAST(YEAR(GETDATE()) AS VARCHAR) 
                  + '/' 
                  + CAST(MONTH(GETDATE()) AS VARCHAR) 
                  + '/' + '19', 102))))), 
                GETDATE()) AS DATE) 

     DECLARE @current DATETIME = CAST(DATEADD(DAY, 
               (DATEDIFF(DAY, 
                  (DATEADD(DAY, 0, 
                  GETDATE())), 
                  (DATEADD(MONTH, 
                  0, 
                  CONVERT(DATETIME, CAST(YEAR(GETDATE()) AS VARCHAR) 
                  + '/' 
                  + CAST(MONTH(GETDATE()) AS VARCHAR) 
                  + '/' + '20', 102))))), 
               GETDATE()) AS DATE) 




     SELECT [Date], 
       Branch , 
       Attendance 
     FROM (SELECT CONVERT(VARCHAR, Date, 103) AS [Date] , 
          Branch , 
          Attendance 
        FROM  Table_attd 
       ) T 
     WHERE (t.Date >= @previous 
        AND t.Date <= @current 
       )