使用 Microsoft 登录
登录或创建帐户。
你好,
使用其他帐户。
你有多个帐户
选择要登录的帐户。

Microsoft 将 Microsoft SQL Server 2008 R2 Service Pack 1 (SP1)作为一个可下载文件进行分发。 由于修补程序是累积的,因此每个新版本都包含以前的 SQL Server 2008 R2 Service Pack 1 (SP1)修复版本附带的所有修补程序和所有安全修补程序。

症状

请考虑以下情况:

  • 在 Microsoft SQL Server 2008 R2 或 Microsoft SQL Server 2012 中的表中有一个 datetimeoffset 数据类型列。

  • 在 datetimeoffset 列上创建索引。

  • 通过使用CAST或convert函数而不使用style参数将datetimeoffset数据类型转换为smalldatetime数据类型,或者当style参数的值为0时。

  • CAST或CONVERT函数的结果在 transact-sql 查询的筛选器中使用。

  • 运行 Transact-sql 查询。

在此方案中,查询返回的结果不正确,因为筛选器不能正常工作。 例如,假设名为 "Date" 的 datetimeoffset 列包含以下值:

  • 2011-05-21 23:00:00 -01:00

  • 2011-05-21 23:00:00 +00:00

  • 2011-05-21 23:00:00 +01:00

您运行以下查询:

SELECT Date FROM TestTable WHERE CAST(Date AS smalldatetime)= '2011-05-21 23:00:00'

查询的结果仅返回一行。 但是,预期结果应返回所有三个值的行。

解决方案

累积更新信息

SQL Server 2012

此问题的修补程序首次在 SQL Server 2012 的累积更新3中发布。有关此累积更新包的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

2723749 SQL Server 2012 累积更新包3注意 由于这些版本是累积的,因此每个新的修复版本都包含以前的 SQL Server 2012 修复版本附带的所有修补程序和所有安全修补程序。 Microsoft 建议你考虑应用包含此修补程序的最新修复版本。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

2692828 在 SQL Server 2012 发布后发布的 SQL Server 2012 版本 必须将 SQL Server 2012 修补程序应用到 SQL Server 2012 的安装。

SQL Server 2008 R2 Service Pack 2

此问题的修补程序首次在 SQL Server 2008 R2 Service Pack 2 的累积更新1中发布。有关如何获取此累积更新包的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

2720425 SQL Server 2008 R2 Service Pack 2 的累积更新包1注意 由于这些版本是累积的,因此每个新的修复版本都包含了以前的 SQL Server 2008 R2 修补程序版本附带的所有修补程序和所有安全修补程序。 我们建议你考虑应用包含此修补程序的最新修复版本。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

2730301 发布 SQL Server 2008 R2 Service Pack 2 后发布的 SQL Server 2008 R2 版本

SQL Server 2008 R2 SP1

此问题的修补程序首次在累积更新7中发布。有关如何为 SQL Server 2008 R2 Service Pack 1 获取此累积更新包的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

2703282 SQL Server 2008 R2 SP1 的累积更新包7注意 由于这些版本是累积的,因此每个新的修复版本都包含了以前的 SQL Server 2008 R2 Service Pack 1 修复版本附带的所有修补程序和所有安全修补程序。 我们建议你考虑应用包含此修补程序的最新修复版本。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

2567616 发布 SQL Server 2008 R2 SP1 后发布的 SQL Server 2008 R2 版本

更多信息

若要重现该问题,请按照下列步骤操作:

  1. 运行以下查询,以便创建带有 datetimeoffset 列的表并插入一些记录:CREATE TABLE #TestTimeZones (dto datetimeoffset(0)); GO INSERT INTO #TestTimeZones(dto) VALUES ('2011-05-21 23:00:00 -01:00'), ('2011-05-21 23:00:00 +00:00'), ('2011-05-21 23:00:00 +01:00'); GO

  2. 运行以下查询,你可以看到在返回的结果中正确列出了所有三个值:DECLARE @t smalldatetime = '2011-05-21 23:00:00' SELECT dto AS withoutIndex FROM #TestTimeZones WHERE CAST(dto AS smalldatetime)=@t;

  3. 运行以下查询,以便在 "dto" 列上创建索引并重复同一查询:CREATE INDEX IX_testTimeZones_Dto ON #TestTimeZones(dto); GO -- Repeat the same query DECLARE @t smalldatetime = '2011-05-21 23:00:00' SELECT dto AS withIndex FROM #TestTimeZones WHERE CAST(dto A smalldatetime)=@t; GO

  4. 再次在步骤2中运行查询。 这次,查询仅返回一行。

  5. 运行以下查询以删除索引和创建的表:DROP INDEX IX_testTimeZones_Dto ON #TestTimeZones; GO DROP TALBE #TestTimeZones; GO

参考

有关 CAST 和 CONVERT 函数的详细信息,请转到以下 MSDN 网站:

有关 SQL Server 中的 CAST 和转换函数的常规信息

状态

Microsoft 已确认这是在“适用范围”部分中列出的 Microsoft 产品存在的问题。

需要更多帮助?

需要更多选项?

了解订阅权益、浏览培训课程、了解如何保护设备等。

社区可帮助你提出和回答问题、提供反馈,并听取经验丰富专家的意见。

此信息是否有帮助?

你对语言质量的满意程度如何?
哪些因素影响了你的体验?
按“提交”即表示你的反馈将用于改进 Microsoft 产品和服务。 你的 IT 管理员将能够收集此数据。 隐私声明。

谢谢您的反馈!

×