我在 SQL Server 中有一个链接表,其中包含一个日期时间列,我在其中存储了一个仅限时间的值*。如果我在没有 dbFailOnError 的情况下执行 UPDATE 查询,它会将该命令转换为 SELECT,然后是一次执行一行的单个 UPDATE 语句:
exec sp_executesql N'UPDATE "dbo"."Appeals" SET "HearingTime"=@P1
WHERE "AppealID" = @P2'
,N'@P1 datetime,@P2 int','1899-12-30 09:00:00',1
...
exec sp_executesql N'UPDATE "dbo"."Appeals" SET "HearingTime"=@P1
WHERE "AppealID" = @P2'
,N'@P1 datetime,@P2 int','1899-12-30 09:00:00',4
如果我执行完全相同的 UPDATE 查询,但使用 dbFailOnError,我会得到以下翻译:
UPDATE "dbo"."Appeals" SET HearingTime={t '09:00:00'}
有趣的是 dbFailOnError 在后端强制执行更有效的 UPDATE,但我真正关心的是时间值本身。
在第一个示例中,Access 正确地将日期时间设置为 12/30/1899(MS Access 的神奇“零”日)。在第二种情况下,这不会发生。最终结果是第一个示例“有效”,而第二个示例无效。
我的意思是,如果我在数据表视图中查看HearingTime字段,Access 会将第一个字段显示为:
9:00:00 AM
第二个显示为(截至撰写本文时,2016 年 9 月 3 日是今天的日期):
9/3/2016 9:00:00 AM
我不得不假设这是微软的一个错误。或者我在这里错过了什么?我有比报告错误并希望微软有朝一日修复它更好的选择吗?
*是的,我知道time
SQL Server 中有一个数据类型。它与 MS Access 日期时间类型不兼容,因此在 MS Access 链接表中对我来说用处不大。