2017-06-01 6 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/20/2017 - 19/5/2017になる月の5月に表示したいと考えています。

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 

しかし、私は私のコードは、6月の月(カットオフ期間は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 
       )