我真的有一个奇怪的行为在访问数据库的sql查询。我想检查日历上是否有空闲的时间段,所以我检查两个特定日期时间之间是否有任何项目。(vrijeme
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点到11点15分之间的时段,得到的是10点45分到11点之间的时段。如果我将OR (startTIme <= #11:00:00# AND (startTIme + duration)> #11:00:00#)更改为OR (startTIme <= #11:00:00# AND (startTIme + duration)># 11:00:01#),添加1秒则问题解决,但第一个查询应该也是
我做了一些测试,减去日期/时间类型的时间分区。
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
在Access的某些情况下,时间计算似乎存在小错误