/ / Problém s konverziou VARCHAR na DATETIME v SQL (s časovou zónou) - sql-server-2012

Problém s konverziou VARCHAR na DATETIME v SQL (s časovou zónou) - sql-server-2012

Snažím sa používať SQL CONVERT príkaz na transformáciu a VARCHAR na a DATETIME v systéme SQL Server 2012. Nasledujúce pokyny a chcem použiť formáty dátumu a času popísané na tejto stránke MSDN: http://msdn.microsoft.com/en-us/library/ms187928.aspx

Na základe toho je formát # 127 opísaný nasledovne:

  • ISO8601 s časovým pásmom Z.
  • yyyy-mm-ddThh: mi: ss.mmmZ (bez medzery)
  • Ak je hodnota v milisekundách (mmm) 0, hodnota milisekundy sa nezobrazí. Napríklad hodnota "2012-11-07T18: 26: 20.000 je zobrazená ako" 2012-11-07T18: 26: 20 ".
  • Voliteľný indikátor časového pásma, Z, sa používa nauľahčiť mapovanie hodnôt dátumov XML, ktoré majú informácie o časovom pásme na hodnoty dátumu SQL Server, ktoré nemajú časové pásmo. Z je indikátor pre časové pásmo UTC-0. Ostatné časové pásma sú označené posunutím HH: MM v smere + alebo -. Napríklad: 2006-12-12T23: 45: 12-08: 00.

Keď sa však pokúšam skutočne vykonať konverziu (podľa tohto formátu), zlyhá ...

SELECT CONVERT(datetime, "2014-07-14T10:00:00.000-08:00", 127)

... s nasledujúcou chybou:

Msg 241, úroveň 16, stav 1, riadok 1
Konverzia zlyhala pri konverzii dátumu a / alebo času z reťazca znakov.

Každý, kto vie, prečo to nefunguje?

EDIT: Príklad nefunguje:

SELECT CONVERT(datetime, "2006-12-12T23:45:12-08:00", 127)

Msg 241, úroveň 16, stav 1, riadok 1
Konverzia zlyhala pri konverzii dátumu a / alebo času z reťazca znakov.

odpovede:

3 pre odpoveď č. 1

Pretože je to reťazec s časové pásmo v ňom musíte konvertovať na DATETIMEOFFSET typ:

SELECT CONVERT(DATETIMEOFFSET, "2014-07-14T10:00:00.000-08:00", 127)

(No column name)
----------------------------------
2014-07-14 10:00:00.0000000 -08:00

To funguje dobre. Akonáhle to máte, potom ju môžete previesť na lokálne DATETIME podľa potreby, napr. s

DECLARE @DateTimeOffset DATETIMEOFFSET
CAST(@DateTimeOffset AS DATETIME)

alebo prepnutím hodnoty na inú časovú zónu

SELECT SWITCHOFFSET(@DateTimeOffset, "+01:00")