2014-03-28 19 views
1

我對訪問數據庫中的一個sql查詢有非常奇怪的行爲。我試圖檢查日曆中是否有一段時間是空閒的,所以我正在檢查兩個特定日期之間是否有任何項目。 (vrijemeMS訪問加/減dataTime時間分區

SELECT eventDate, startTIme, startTIme+ duration, duration 
FROM tblTermins 
WHERE 
AND eventDate = #2014-03-30# 
AND (
(startTIme <= #11:00:00# AND (startTIme + duration) >= #11:15:00#) 
OR (startTIme <= #11:00:00# AND (startTIme + duration) > #11:00:00#) 
OR (startTIme < #11:15:00# AND (startTIme + duration) >= #11:15:00#) 
OR (startTIme >= #11:00:00# AND (startTIme + duration) <= #11:15:00#) 
) 

我得到:

eventDate startTIme startTIme + duration duration 
30.3.2014. 10:45:00  11:00:00    0:15:00 

奇怪的是,我不應該讓該行,因爲在所有它不符合標準我檢查期間11:00和11:15之間如果我將OR(開始時間< =#11:00:00#AND(開始時間+持續時間)>#11:00:00#)更改爲 或(開始時間< =#11:00:00#AND(startTIme + duration)>#11:00:#),加1秒就可以解決問題,但首先查詢應該也能工作

+0

難道這是「開始時間+持續時間」真的是幾毫秒*過去* 11:00,所以它匹配第二行? –

+0

idk,當我選擇它時,我沒有看到它。訪問日期時間是否有毫秒? – Zivko

回答

0

我做了一些測試,減去日期/時間類型的時間分區。

eventDate startTime duration 
--------- --------- -------- 
2014-03-30 10:45:00  00:15:00 
...   ...   ... 


SELECT eventDate, startTIme, duration, startTIme+duration AS endTime, 
     CDbl(startTIme+duration) AS endTimeValue, 
     CDbl(#11:00:00#) as elevenClockValue, 
     CDbl(startTIme+duration - #11:00:00#) As calculationDifference 
FROM tblTermins 
WHERE 
[startTime]+[duration] >#11:00:00# 


eventDate startTIme duration endTime endTimeValue elevenClockValue calculationDifference 
--------- --------- -------- ------- ------------ ---------------- --------------------- 
30.03.2014 10:45:00 0:15:00  11:00:00 0,4583333333333 0,45833333333333 5,55111512312578E-17 

數學運算後添加/與時間值扣除並轉換成數值,我們得到小分區,使得從預期的時間差。

所以我們可以對數值進行舍入或者如果它與應用程序數據和邏輯沒有衝突,則可以加1秒。

即使這個查詢會返回一些差異

SELECT Cdbl(#10:45:00# + #00:15:00# - #11:00:00#) FROM tblTermins 

Result 
-------------------- 
5,55111512312578E-17 

在附加測試中,我發現,在大多數情況下,我會得到正確的值相減的結果,或者增加時間值。

例如:

SELECT Cdbl(#10:35:00# + #00:25:00# - #11:00:00#) FROM tblTermins 

Result 
-------------------- 
0 

它看起來有小蟲子在存取時間callculation的一些情況。