【发布时间】:2017-01-11 05:16:29
【问题描述】:
我在 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
第二个显示为(截至撰写本文时,9/3/16 是今天的日期):
9/3/2016 9:00:00 AM
我不得不假设这是微软的一个错误。或者我在这里错过了什么?我是否有比报告错误并希望微软有朝一日修复它更好的选择?
*是的,我知道 SQL Server 中有 time 数据类型。它与 MS Access 日期时间类型不兼容,因此在 MS Access 链接表中对我来说几乎没有用处。
【问题讨论】:
-
您使用的是哪个 ODBC 驱动程序?你试过不同的吗?哪个版本的 SQL Server?
-
我正在使用 {SQL Server} 驱动程序 (SQLSRV32.dll)。但是我在使用 {SQL Server Native Client 11.0} (SQLNCLI11.dll) 和 {SQL Server Native Client 10.0} (SQLNCLI10.dll) 时得到了相同的行为。我也使用 {ODBC Driver 11 for SQL Server} (MSODBCSQL11.dll) 和 {ODBC Driver 13 for SQL Server} (MSODBCSQL13.dll) 得到相同的行为。
标签: sql-server datetime ms-access defects