2017-06-01 114 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 
       )