2016-02-15 108 views
1

我有下面的查詢,它給了我一個學生缺席的天數。 DATEDIFF和DATEPART計算平日和假期不應算作缺席日。缺席的日子存儲在studentDable中的兩個字段中,分別是FromDate和toDate。所以缺席的日子在日期範圍內。如果某位學生缺勤一天,則記錄於2015年11月23日,11/23/2015。如果一個學生缺席兩天,那麼2015年11月23日,2015年11月24日。選擇日期範圍內的某些日期

DECLARE @startDate DATE SET @startDate = '20151121' 
DECLARE @endDate DATE SET @endDate = '20151123'  

SELECT  
    a.studentName 

    ,SUM(DATEDIFF(dd, fromDate, toDate) 
    - (DATEDIFF(wk, fromDate, toDate) * 2) 
    -CASE WHEN DATEPART(dw, fromDate) = 1 THEN 1 ELSE 0 END 
    +CASE WHEN DATEPART(dw, toDate) = 1 THEN 1 ELSE 0 END + 1)- COUNT(h.holiday) 
    AS totalAbsentDay   

    FROM studentTable a 
LEFT OUTER JOIN holiday h 
ON h.holiday < a.toDate and h.holiday > a.fromDate 

WHERE a.fromDate = @startDate AND a.toDate = @endDate 
GROUP BY a.studentName 

的這裏的問題是,當我嘗試宣告開始和結束日期,它並沒有給我正確的缺勤天數。 例如,如果學生在11/23/2015和11/26/2015之間缺席4天缺席,並且我聲明開始日期爲2015年11月22日和2015年11月27日結束日期,牛逼給我的3

+0

你確定在哪裏? fromDate = @startDate AND a.toDate = @ endDate'是正確的過濾器..?我的意思是如果過濾器註釋掉了,結果是正確的? – Susilo

+0

是的,Susilo。如果你註釋掉DECLARE部分和WHERE子句。查詢工作正常。 – NCooper

+0

我試着用我自己的數據根據​​我自己的感覺..即使在'declare'和'where'註釋掉你的查詢失敗後,如果在一個學生缺席的情況下有多個假期,它會變成..可能是我的感覺是錯的..所以請你分享表格結構和樣本數據..? – Susilo

回答

1

結果這個查詢下面將對於給定的數據庫模式工作,可能不是最好的解決方案,因爲查詢

DECLARE @startDate DATE SET @startDate = '2016-02-05' 
DECLARE @endDate DATE SET @endDate = '2016-02-20'  

SELECT 
    studentName, 
    SUM(AbsentDay) totalAbsentDay 
FROM 
(
    SELECT  
     a.studentName 
     ,DATEDIFF(dd, fromDate, toDate) 
     - (DATEDIFF(wk, fromDate, toDate) * 2) 
     -CASE WHEN DATEPART(dw, fromDate) = 1 THEN 1 ELSE 0 END 
     +CASE WHEN DATEPART(dw, toDate) = 1 THEN 1 ELSE 0 END + 1 - COUNT(h.holiday) 
     AS AbsentDay   
     FROM (
      SELECT 
       studentName,-- Name, 
       CASE WHEN fromDate<@startDate THEN @startDate ELSE fromDate END fromDate, 
       CASE WHEN toDate>@endDate THEN @endDate ELSE toDate END toDate 
      FROM 
       StudentTable S 
      WHERE 
       S.toDate >= @startDate AND s.fromDate <= @endDate 
     ) a 
     LEFT OUTER JOIN holiday h 
     ON h.holiday < a.toDate and h.holiday > a.fromDate 

    GROUP BY studentName, fromDate, toDate 
) B 
GROUP BY studentName 

爲了方便查詢和更快的執行速度,請考慮重新設計的使用三級studentTable類似idStudent,AbsentDate ..只是一個建議..

相關問題