使用 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引數),或style引數的值為0,將datetimeoffset資料類型轉換為Smalldatetime資料類型。

  • 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 與 CONVERT 函數的一般資訊

狀態

Microsoft 已確認本篇文章<適用於>一節所列之 Microsoft 產品確實有上述問題。

需要更多協助嗎?

想要其他選項嗎?

探索訂閱權益、瀏覽訓練課程、瞭解如何保護您的裝置等等。

社群可協助您詢問並回答問題、提供意見反應,以及聆聽來自具有豐富知識的專家意見。

這項資訊有幫助嗎?

您對語言品質的滿意度如何?
以下何者是您會在意的事項?
按下 [提交] 後,您的意見反應將用來改善 Microsoft 產品與服務。 您的 IT 管理員將能夠收集這些資料。 隱私權聲明。

感謝您的意見反應!

×