2016-11-09 10 views
0

で出席します:私はこのような任意の月の出席を見つけようとしています月の名前

DECLARE @StartDate DATE 
DECLARE @EndDate DATE 
SET @StartDate = '2016/10/01' 
SET @EndDate = '2016/10/31' 


SELECT 
StaffAttendance.StaffId, DATENAME(MONTH, @StartDate) AS [ForMonth], 
    (DATEDIFF(dd, @StartDate, @EndDate) + 1) 
    -(DATEDIFF(wk, @StartDate, @EndDate) * 1) 
    -(CASE WHEN DATENAME(dw, @StartDate) = 'Sunday' THEN 1 ELSE 0 END) AS TotalWorkingDays, 
    SUM(StaffAttendance.AttendanceStatusId) AS TotalDaysWorked FROM StaffAttendance WHERE [Date] BETWEEN @StartDate AND @EndDate AND StaffAttendance.AttendanceStatusId = 1 GROUP BY StaffAttendance.StaffId 

そして、これは私がちゃんとある、取得していますものです。

enter image description here

は、私は次のやりたいことは代わりのような日付範囲(@StartDateのDATE、@EndDate DATE)と使用の月名を省略している - 「10月」と'10などのない月の番号「。ユーザーが月名を指定し、その月の開始日と終了日が自動的に計算されます。フェリックス・パミットンの助けがありました。

DECLARE @month VARCHAR(9) = 'february'; 

WITH CteMonths(n, m) AS(
    SELECT 1, 'January' UNION ALL 
    SELECT 2, 'February' UNION ALL 
    SELECT 3, 'March' UNION ALL 
    SELECT 4, 'April' UNION ALL 
    SELECT 5, 'May' UNION ALL 
    SELECT 6, 'June' UNION ALL 
    SELECT 7, 'July' UNION ALL 
    SELECT 8, 'August' UNION ALL 
    SELECT 9, 'September' UNION ALL 
    SELECT 10, 'October' UNION ALL 
    SELECT 11, 'November' UNION ALL 
    SELECT 12, 'December' 
) 
SELECT 
    DATEADD(MONTH, n - 1, DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()), 0)) AS StartDate, 
    DATEADD(DAY, -1, DATEADD(MONTH, n, DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()), 0))) AS EndDate 
FROM CteMonths 
WHERE m = @month 

ここで、これら2つを組み合わせて上記と同じ結果を得るにはどうすればよいですか?

答えて

0

使用CROSS APPLY

DECLARE @month VARCHAR(9) = 'february'; 

WITH CteMonths(n, m) AS(
    SELECT 1, 'January' UNION ALL 
    SELECT 2, 'February' UNION ALL 
    SELECT 3, 'March' UNION ALL 
    SELECT 4, 'April' UNION ALL 
    SELECT 5, 'May' UNION ALL 
    SELECT 6, 'June' UNION ALL 
    SELECT 7, 'July' UNION ALL 
    SELECT 8, 'August' UNION ALL 
    SELECT 9, 'September' UNION ALL 
    SELECT 10, 'October' UNION ALL 
    SELECT 11, 'November' UNION ALL 
    SELECT 12, 'December' 
) 
SELECT 
    sa.StaffId, 
    DATENAME(MONTH, t.StartDate) AS [ForMonth], 
    (DATEDIFF(dd, t.StartDate, t.EndDate) + 1) 
     - (DATEDIFF(wk, t.StartDate, t.EndDate) * 1) 
     - (CASE WHEN DATENAME(dw, t.StartDate) = 'Sunday' THEN 1 ELSE 0 END) AS TotalWorkingDays, 
    SUM(sa.AttendanceStatusId) AS TotalDaysWorked 
FROM StaffAttendance sa 
CROSS APPLY(
    SELECT 
     DATEADD(MONTH, n - 1, DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()), 0)) AS StartDate, 
     DATEADD(DAY, -1, DATEADD(MONTH, n, DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()), 0))) AS EndDate 
    FROM CteMonths 
) t 
WHERE 
    sa.[Date] >= t.StartDate 
    AND sa.[Date] < DATEADD(DAY, 1, t.EndDate) 
    AND sa.AttendanceStatusId = 1 
GROUP BY sa.StaffId 
関連する問題