簡體   English   中英

在Access(SQL)中查找兩個日期之間的連續和單實例日期

[英]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運行Access中保留的查詢,以將所需的記錄(在日期點之間)附加到新表中。
  • 從Excel運行Select查詢以返回實例(星期日除外)。

要從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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM