KB2715289 - การแก้ไข: ผลลัพธ์ไม่ถูกต้องเมื่อคุณแปลงคอลัมน์ datetimeoffset เป็นคอลัมน์ smalldatetime ใน SQL Server 2008 R2 หรือใน SQL Server 2012 เมื่อมีดัชนีอยู่บนคอลัมน์ DateTimeOffset

นำไปใช้กับ
SQL Server 2008 R2 Datacenter SQL Server 2008 R2 Developer SQL Server 2008 R2 Enterprise SQL Server 2008 R2 Standard SQL Server 2008 R2 Web SQL Server 2008 R2 Workgroup SQL Server 2012 Business Intelligence SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Standard SQL Server 2012 Web SQL Server 2012 Enterprise Core

Microsoft แจกจ่ายการแก้ไข Microsoft SQL Server 2008 R2 Service Pack 1 (SP1) เป็นไฟล์เดียวที่สามารถดาวน์โหลดได้ เนื่องจากการแก้ไขเป็นแบบสะสม การเผยแพร่ใหม่แต่ละรายการจะมีโปรแกรมแก้ไขด่วนและการแก้ไขข้อบกพร่องด้านความปลอดภัยทั้งหมดที่รวมอยู่ในการแก้ไข SQL Server 2008 R2 Service Pack 1 (SP1) รุ่นก่อนหน้า

อาการ

ลองทำตามสถานการณ์ต่อไปนี้:

  • คุณมีคอลัมน์ชนิดข้อมูล datetimeoffset ในตารางใน Microsoft SQL Server 2008 R2 หรือใน Microsoft SQL Server 2012
  • คุณสร้างดัชนีบนคอลัมน์ datetimeoffset
  • คุณสามารถแปลงชนิดข้อมูล datetimeoffset เป็นชนิดข้อมูล smalldatetime ได้โดยใช้ฟังก์ชัน CAST หรือ CONVERT โดยไม่มีอาร์กิวเมนต์ style หรือเมื่อค่าของอาร์กิวเมนต์ style เป็น 0
  • ผลลัพธ์ของฟังก์ชัน CAST หรือ CONVERT จะถูกใช้ในตัวกรองในคิวรี Transact-SQL
  • คุณเรียกใช้คิวรี Transact-SQL

ในสถานการณ์นี้ ผลลัพธ์ที่ส่งคืนโดยคิวรีไม่ถูกต้องเนื่องจากตัวกรองทํางานไม่ถูกต้อง ตัวอย่างเช่น สมมติว่าคอลัมน์ datetimeoffset ที่ชื่อ "Date" มีค่าต่อไปนี้

  • 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

การแก้ไขปัญหานี้เผยแพร่ครั้งแรกใน การอัปเดตสะสม 3 สําหรับ SQL Server 2012 สําหรับข้อมูลเพิ่มเติมเกี่ยวกับแพคเกจโปรแกรมปรับปรุงสะสมนี้ ให้คลิกหมายเลขบทความต่อไปนี้เพื่อดูบทความในฐานความรู้ของ Microsoft:

2723749 แพคเกจการปรับปรุงสะสม 3 สําหรับ SQL Server 2012 หมายเหตุ เนื่องจากรุ่นนี้เป็นแบบสะสม การแก้ไขใหม่แต่ละรุ่นจะมีโปรแกรมแก้ไขด่วนและการแก้ไขความปลอดภัยทั้งหมดที่รวมอยู่ในการแก้ไข 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

การแก้ไขสําหรับปัญหานี้ถูกเผยแพร่ครั้งแรกในการอัปเดตสะสม 1 สําหรับ SQL Server 2008 R2 Service Pack 2 สําหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการขอรับแพคเกจโปรแกรมปรับปรุงสะสมนี้ ให้คลิกหมายเลขบทความต่อไปนี้เพื่อดูบทความใน Microsoft Knowledge Base:

2720425 แพคเกจการปรับปรุงสะสม 1 สําหรับ SQL Server 2008 R2 Service Pack 2 หมายเหตุ เนื่องจากรุ่นนี้เป็นแบบสะสม การแก้ไขใหม่ๆ ที่เผยแพร่ใหม่แต่ละรายการจะมีโปรแกรมแก้ไขด่วนและการแก้ไขความปลอดภัยทั้งหมดที่รวมอยู่ในการแก้ไข SQL Server 2008 R2 ก่อนหน้านี้ เราขอแนะนําให้คุณพิจารณาใช้การแก้ไขล่าสุดที่มีโปรแกรมแก้ไขด่วนนี้ไปใช้ สําหรับข้อมูลเพิ่มเติม โปรดคลิกที่หมายเลขบทความต่อไปนี้เพื่อดูบทความในฐานความรู้ของ Microsoft:

2730301 รุ่น SQL Server 2008 R2 ที่วางจําหน่ายภายหลัง SQL Server 2008 R2 Service Pack 2

SQL Server 2008 R2 SP1

การแก้ไขสําหรับปัญหานี้เผยแพร่ครั้งแรกในการอัปเดตสะสม 7 สําหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการขอรับแพคเกจโปรแกรมปรับปรุงสะสมสําหรับ SQL Server 2008 R2 Service Pack 1 นี้ ให้คลิกหมายเลขบทความต่อไปนี้เพื่อดูบทความในฐานความรู้ของ Microsoft:

2703282 แพคเกจการปรับปรุงสะสม 7 สําหรับ SQL Server 2008 R2 SP1 หมายเหตุ เนื่องจากรุ่นนี้เป็นแบบสะสม การแก้ไขใหม่แต่ละรุ่นจะมีโปรแกรมแก้ไขด่วนและการแก้ไขความปลอดภัยทั้งหมดที่รวมอยู่ในการแก้ไข SQL Server 2008 R2 Service Pack 1 ก่อนหน้านี้ เราขอแนะนําให้คุณพิจารณาใช้การแก้ไขล่าสุดที่มีโปรแกรมแก้ไขด่วนนี้ไปใช้ สําหรับข้อมูลเพิ่มเติม โปรดคลิกที่หมายเลขบทความต่อไปนี้เพื่อดูบทความในฐานความรู้ของ Microsoft:

2567616 รุ่น SQL Server 2008 R2 ที่วางจําหน่ายภายหลัง SQL Server 2008 R2 SP1

ข้อมูลเพิ่มเติม

เมื่อต้องการจําลองปัญหาซ้ํา ให้ทําตามขั้นตอนเหล่านี้:

  1. เรียกใช้คิวรีต่อไปนี้เพื่อสร้างตารางที่มีคอลัมน์ datetimeoffset และแทรกระเบียนบางรายการ

    CREATE TABLE #TestTimeZones (dto datetimeoffset(0)); ใส่ลงในค่า #TestTimeZones(DTO) ('2011-05-21 23:00:00 -01:00'), ('2011-05-21 23:00:00 +00:00'), ('2011-05-21 23:00:00 +01:00'); ไป

  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 -- ทําซ้ําคิวรีเดียวกัน DECLARE @t smalldatetime = '2011-05-21 23:00:00' SELECT dto AS withIndex FROM #TestTimeZones WHERE CAST(dto A smalldatetime)=@t; ไป

  4. เรียกใช้คิวรีในขั้นตอนที่ 2 อีกครั้ง ครั้งนี้ คิวรีจะส่งกลับเพียงหนึ่งแถว

  5. เรียกใช้คิวรีต่อไปนี้เพื่อลบดัชนีและตารางที่คุณสร้างขึ้น:

    DROP INDEX IX_testTimeZones_Dto ON #TestTimeZones; ไปวาง TALBE #TestTimeZones; ไป

การอ้างอิง

สําหรับข้อมูลเพิ่มเติมเกี่ยวกับฟังก์ชัน CAST และ CONVERT ให้ไปที่เว็บไซต์ MSDN ต่อไปนี้:

ข้อมูลทั่วไปเกี่ยวกับฟังก์ชัน CAST และ CONVERT ใน SQL Server

สถานะ

Microsoft ได้ยืนยันว่านี่เป็นปัญหาที่เกิดขึ้นกับผลิตภัณฑ์ของ Microsoft ที่แสดงไว้ในส่วน "นำไปใช้กับ"