KB2715289 – КОРЕКЦИЯ: Неправилни резултати, когато преобразувате колона datetimeoffset в колона DateOffset в 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 заявката.

В този случай резултатът, върнат от заявката, е неправилен, защото филтърът не работи правилно. Да приемем например, че колоната за изместване от дата и час, която е наречена "Дата", съдържа следните стойности:

  • 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 2012Note Тъй като компилациите са кумулативни, всяка нова корекция съдържа всички актуални поправки и корекции на защитата, които са включени в предишното издание на корекция 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:

2720425 Сборен пакет за актуализация 1 за SQL Server 2008 R2 Service Pack 2Note Тъй като компилациите са кумулативни, всяка нова корекция съдържа всички актуални поправки и корекции на защитата, които са включени в предишното издание на корекция 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 SP1Note Тъй като компилациите са кумулативни, всяко ново издание на корекции съдържа всички актуални поправки и корекции на защитата, които са включени в предишното издание на корекция за SQL Server 2008 R2 Service Pack 1. Препоръчваме ви да помислите за прилагане на най-новото издание на корекцията, което съдържа тази гореща корекция. За допълнителна информация щракнете върху следния номер на статия, за да прегледате статията в базата знания на Microsoft:

2567616 Компилациите на SQL Server 2008 R2, които са издадени след издаването на SQL Server 2008 R2 SP1

Повече информация

За да възпроизведете проблема, изпълнете следните стъпки:

  1. Изпълнете следната заявка, за да създадете таблица с колона за промяна на дата и час и да вмъкнете някои записи:

    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'); ОТИДЕТЕ

  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 НА #TestTimeZones; GO DROP TALBE #TestTimeZones; ОТИДЕТЕ

Справки

За повече информация относно функциите CAST и CONVERT отидете на следния уеб сайт на MSDN:

Обща информация за функциите CAST и CONVERT в SQL Server

Състояние

Microsoft потвърждава, че това е проблем в продуктите на Microsoft, които са изброени в раздела „Важи за“.