2013-01-31 27 views
1

我有一個奇怪的邏輯問題,我似乎無法將我的頭圍繞起來(可能是因爲研究它太久了)。Access中的日期範圍處理邏輯

我在哪裏工作,我們有一個非常老的軟件,我們需要使用它來跟蹤我們使用的設備的狀態。該軟件提供了很少的功能來操縱這些狀態,以嘗試並提供停機時間的良好分析。我一直在研究Access中的數據庫應用程序(因爲它是他們提供給我的唯一工具),可以將舊系統的狀態數據導入更容易操作的格式。

狀態數據從舊的計劃吐出的方法是相當直接:

EQUIPNAME狀態的startDateTime ENDDATETIME

這是很容易閱讀的文本,並將其插入到表中的訪問。我遇到的問題來自於試圖找出一件設備在不同日期範圍內處於不同狀態所花費的時間。

開始/結束日期/時間可以是任何時間長度。找到哪些行包含日期很困難。我一直在使用語句間的SQL,試圖找到他們其中,在大多數情況下,工作進行的順利:

SELECT * FROM Statuses WHERE 
    (StartDateTime BETWEEN [StartDT] AND [EndDT]) 
OR 
    (EndDateTime BETWEEN [StartDT] AND [EndDT]) 

真正的問題是,當的startDateTime是BEFORE StartDT和EndDateTime之後EndDT(即整我期待的範圍是INSIDE這個狀態的開始/結束日期)。它根本找不到它,這是有道理的。

我似乎無法想出一個優雅的解決方案。我需要能夠選擇包含或包含在提供的日期範圍內的狀態的所有行。我通常不會來這裏這樣一個簡單的問題,但我的大腦和谷歌福正在讓我失望。

樣本數據的一點點:

EQUIP STATUS STARTDATETIME ENDDATETIME 
A123 OPER 01/30/2013 21:30 12/31/1999 00:00 
A123 DFM 01/26/2013 10:42 01/30/2013 21:29 
A123 OPER 01/01/2013 00:00 01/26/2013 10:41 
B123 OPER 01/01/2013 00:00 12/31/1999 00:00 
C123 DFU 01/29/2013 12:31 12/31/1999 00:00 
C123 OPER 01/01/2013 00:00 01/29/2013 12:30 
+0

我懷疑你可能被UDF誤引了。你能發佈樣本數據嗎? – Fionnuala

+0

你是什麼意思?數據很簡單,日期時間格式如下:2013/1/31 12:34 –

+0

我的意思是可能有一個解決方案使用更多的SQL和更少的UDF。示例數據將包括說明狀態更改的幾行。 – Fionnuala

回答

2

任何一種預訂勾結的情況下發生:

RequestStartDate <= EndDate 
and 
RequestEndDate >= StartDate 

以上也將返回重疊。因此,如果我今天+明天查詢,並且範圍從今年到年底開始,則查詢將包含在範圍內。

如:

Select * from tblEQUIP 
where 
    #01/31/2013# <= ENDDATETIME 
    and 
    #02/01/2013# >= StartDateTime 

此時,您可以在 「進程」 每個記錄。您可能要使用這樣的:

Do while RecordDate.eof = false 

    For datePtr = RequestStartDateTime to RequestendDateTime 
     If datePtr >= RecordData!StartDateTime and DatePtr <= RecordData!EndDateTime then 
     DaysTotal = DaysTotal + 1 
     End if 
    Next DatePtr 
    recordData.Movenext 
loop 

以上是空氣的代碼,但顯示您需要先搶重疊記錄的基本處理循環,然後處理循環加起來天/時間爲每個記錄在你的日期範圍內,確定的日期範圍下降。

+0

它看起來很完美。我很感激幫助。這是一個簡單的解決方案,我踢自己沒有看到它,但我想這就是當你的工作太多時會發生什麼。 –

0

有趣的問題!對不起,現在沒有太多時間來進行配置,但我建議您爲此探索Partition函數,或者和/或進行以日期爲列標題的交叉表查詢。更多關於msoffice sitehere