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ď č. 1Pretož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")