我正在将数据库从Microsoft Access移动到SQL服务器,并验证远程和本地表之间的数据相等性。在这样做时,我在比较时间字段时遇到了一个奇怪的现象。
我正在使用以下功能:
Public Function CheckAllFieldsEqual(rs1 As DAO.Recordset, rs2 As DAO.Recordset) As Boolean
Dim fld As DAO.Field
CheckAllFieldsEqual = True
For Each fld In rs1.Fields
If fld.Value <> rs2.Fields(fld.NAME).Value Then GoTo ReturnFalse
Next fld
Exit Function
ReturnFalse:
Debug.Print "Fields inequal! " & fld.NAME & ": " & fld.Value & " - "; rs2.Fields(fld.NAME).Value
CheckAllFieldsEqual = False
MsgBox "Inequal!", vbCritical
Stop
End Function
rs1
是远程记录集,设置为随机行。 rs2
是本地变体,设置为具有相同主键的行。它们应该是相同的,因为我只是通过使用DoCmd.TransferDatabase
Debug.Print fld.Value
返回09:46:00。 Debug.Print rs2.Fields(fld.NAME).Value
也会在09:46:00返回。但是,比较没有通过。
奇怪的部分:
Debug.Print CDbl(fld.Value)
返回0.406944444444444
Debug.Print CDbl(rs2.Fields(fld.NAME).Value)
返回0.406944444444445
如何避免这些错误?我应该添加类型检查并检查具有一定精度的时间字段的相等性,还是有更简单的方法来避免这种情况?
答案 0 :(得分:1)
使用 DateDiff 。完全出于这样的目的忽略浮点错误:
If DateDiff("s", fld.Value, rs2.Fields(fld.NAME).Value) <> 0 Then GoTo ReturnFalse