[英]Finding Consecutive and single instance dates, between two dates, in Access(SQL)
大家早,
我想知道每個缺席實例,其中一個實例是兩個日期之間的任何一天或連續幾天。 我在最初的問題中對此提供了廣泛的幫助,並且除了“兩個日期之間”部分之外,所有其他方面都有有效的代碼。 我希望有人可以幫助我將“兩個日期之間”元素添加到工作代碼中。
問題示例:
每個人在16年3月1日到2016年1月19日之間缺席了多少天,總共有幾天?
樣本數據:
|IDRef |RecordDate |Racf |Type |LengthOfAbsence
|1788 |04-Jan-16 |Bob |Sickness |420
|1789 |04-Jan-16 |Jill |Sickness |420
|1790 |05-Jan-16 |Bob |Sickness |420
|1791 |17-Jan-16 |Jill|Sickness |420
|1792 |18-Jan-16 |Bob |Sickness |420
預期產量:
| Racf |Total Days |Instances
|Bob | 3 |2
|Jill |2 |2
工作代碼:
SELECT Absence.Racf, Count(Absence.RecordDate) AS CountOfRecordDate
FROM Absence LEFT JOIN (select Racf, [RecordDate]+IIf(Weekday([RecordDate],7)=1,2,1) as RecordDate2 from Absence) AS t2 ON (Absence.RecordDate = t2.RecordDate2) AND (Absence.Racf = t2.Racf)
WHERE (((t2.RecordDate2) Is Null))
GROUP BY Absence.Racf;
我最近的嘗試將其修改為僅在兩個日期之間查找(這不會引起錯誤,但會返回意外/錯誤的值):
Sql = "SELECT Absence.Racf, Count(Absence.RecordDate) AS CountOfRecordDate "
Sql = Sql & "FROM Absence LEFT JOIN (select Racf, [RecordDate]+IIf(Weekday([RecordDate],7)=1,2,1) as RecordDate2 from Absence where [RecordDate] BETWEEN #" & sFromDate & "# AND #" & sToDate & "#) AS t2 ON (Absence.RecordDate = t2.RecordDate2) AND (Absence.Racf = t2.Racf) "
Sql = Sql & "WHERE (((t2.RecordDate2) Is Null)) AND [t2.RecordDate2] BETWEEN #" & sFromDate & "# AND #" & sToDate & "# "
Sql = Sql & "GROUP BY Absence.Racf;"
這里的原始問題: 為關聯名稱(VBA,SQL)計算連續日期的實例
最后一步的任何幫助將不勝感激,對它為何起作用的解釋也不會受到傷害,因為我不知道!
這是我在Access中測試過的新工作代碼,但尚未在Excel調用的宏中測試過
SELECT Absence.Racf, Count(Absence.RecordDate) AS CountOfRecordDate, Absence.RecordDate
FROM Absence LEFT JOIN [select Racf, [RecordDate]+IIf(Weekday([RecordDate],7)=1,2,1) as RecordDate2 from Absence]. AS t2 ON (Absence.Racf = t2.Racf) AND (Absence.RecordDate = t2.RecordDate2)
WHERE (((t2.RecordDate2) Is Null))
GROUP BY Absence.Racf, Absence.RecordDate
HAVING (((Absence.RecordDate)>#1/1/2016# And (Absence.RecordDate)<#10/11/2016#));
日期范圍在WHERE子句中不起作用的原因是此處的日期始終為NULL,因此您永遠不會獲得任何記錄。
您同樣可以使用BETWEEN語句代替>和<。
抱歉,這不是您想要的整潔解決方案,但這超出了您在Access中的單個查詢中可以輕松完成的范圍。 輸出看起來像這樣
我建議您執行的操作(如果您想對多個用戶進行此操作)是使用數據透視表匯總每個用戶的結果。
但您也可以嘗試
SQL = "select racf, count(racf) AS Instances from ("
SQL = SQL & "SELECT Absence.Racf, Count(Absence.RecordDate) AS CountOfRecordDate,Absence.RecordDate"
SQL = SQL & " FROM (Absence LEFT JOIN (select Racf, RecordDate+IIf(Weekday([RecordDate],7)=1,2,1) as RecordDate1 from Absence) AS t1 ON (Absence.RecordDate = t1.RecordDate1) AND (Absence.Racf = t1.Racf))"
SQL = SQL & " WHERE ((t1.RecordDate1) Is Null) "
SQL = SQL & " GROUP BY Absence.Racf,Absence.RecordDate"
SQL = SQL & " HAVING (((Absence.RecordDate)>#1/1/2016# And (Absence.RecordDate)<#10/11/2016#))"
SQL = SQL & ") AS T0 GROUP BY RACF"
編輯
我敢肯定,雖然正確,但可以簡化此過程,因為內部GROUP BY沒有任何用處-HAVING子句應作為WHERE子句帶到T0之外。
它應該看起來像這樣
SQL = "select racf, count(racf) AS Instances from ("
SQL = SQL & "SELECT Absence.Racf, Absence.RecordDate"
SQL = SQL & " FROM (Absence LEFT JOIN (select Racf, RecordDate+IIf(Weekday([RecordDate],7)=1,2,1) as RecordDate1 from Absence) AS t1 ON (Absence.RecordDate = t1.RecordDate1) AND (Absence.Racf = t1.Racf))"
SQL = SQL & " WHERE ((t1.RecordDate1) Is Null) "
SQL = SQL & ") AS T0 WHERE (((RecordDate)>#1/1/2016# And (RecordDate)<#10/11/2016#))"
SQL = SQL & "GROUP BY RACF"
編輯
現在已經對此進行了測試,但是它確實可以工作,但是像#10/11/2016#這樣的日期卻模棱兩可-盡管我的語言環境是英國,但該日期似乎被解釋為2016年10月11日。
建議改用
Datevalue(""10 November 2016"")
引號必須加倍,因為它們出現在帶引號的字符串中。
多虧湯姆的回答,我終於到了那里。
要檢索某個日期范圍內單個或連續日期的實例,可以使用以下方法:
要從Excel運行查詢(db已定義為OpenDatabase):
db.QueryDef.Execute
附加查詢:
INSERT INTO AbsenceInstances ( Racf, RecordDate )
SELECT Absence.Racf, Absence.RecordDate
FROM Absence
WHERE ((Absence.RecordDate)>=#01/01/2017# And (Absence.RecordDate)<=#28/03/2017#);
選擇查詢:
Sql = "SELECT AbsenceInstances.Racf, Count(AbsenceInstances.RecordDate) AS CountOfRecordDate"
Sql = Sql & " FROM AbsenceInstances LEFT JOIN (select Racf, [RecordDate]+IIf(Weekday([RecordDate],7)=1,2,1) as RecordDate2 from AbsenceInstances) AS t2 ON (AbsenceInstances.RecordDate = t2.RecordDate2) AND (AbsenceInstances.Racf = t2.Racf)"
Sql = Sql & " WHERE (((t2.RecordDate2) Is Null))"
Sql = Sql & " GROUP BY AbsenceInstances.Racf;"
非常感謝湯姆的幫助。 我希望這個總結對以后的任何人都有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.