Comment faire pour convertir un DateTime chaîne DateTime de SQL Server
J'ai un DateTime varchar dans ce format: 2005-08-08T00:00:00+01:00.
- Ne ce format ont un nom? (ce n'est pas ISO8601. Est-il RFC3339?)
- Comment puis-je convertir un DateTime l'aide d'instructions Transact-Sql?
MODIFIER
Voici un résumé de la réponse, bricolé à partir d'autres entrées:
- Il est ISO8601 avec un décalage de l'heure UTC. Si c'était UTC ce serait la fin avec un " Z "au lieu de" +01:00'. wikipédia
- Vous pouvez le convertir à l'heure locale ou l'heure utc comme suit:
DECLARE @d VARCHAR(25) SET @d = '2007-08-08T00:01:00+01:00' SET @d =
'2007-08-08T00:01:00-01:00' SET @d = '2007-08-08T00:01:00+05:30'SELECT @d Entrée, CONVERT(DATETIME, à GAUCHE(@d, 19), 126) LocalDate
DATEADD(MINUTE , -CAST((SUBSTRING(@d, 20, 1) + DROIT(@d, 2))
INT) , DATEADD(HEURE
,-CAST(SUBSTRING(@d, 20, 3) COMME INT)
CONVERT(DATETIME, à GAUCHE(@d, 19), 126))) UtcDate OÙ @d COMME '_--_T__::[+-]:'
Résultats:
Input LocalDate UtcDate
------------------------- ----------------------- -----------------------
2007-08-08T00:01:00+01:00 2007-08-08 00:01:00.000 2007-08-07 23:01:00.000
2007-08-08T00:01:00-01:00 2007-08-08 00:01:00.000 2007-08-08 01:01:00.000
2007-08-08T00:01:00+05:30 2007-08-08 00:01:00.000 2007-08-07 18:31:00.000
Veuillez vérifier cette page--> sqlusa.com/bestpractices/datetimeconversion
Oui, j'ai trouvé que la page d'aide de google. Impossible de trouver mon format en il y bien que.
Une chose à noter est que votre SUBSTRING() supprime le procès-verbal de la composante de l'fuseau horaire, sens il être incorrecte dans les fuseaux horaires qui ne sont pas des heures entières par rapport à l'heure UTC. par exemple, en Inde, qui est UTC+5:30.
ah, aussi, si le format est quelque chose comme 2005-08-08T00:00:00-01:00, c'est à dire le décalage est moins à la place de la positif, votre résultat sera faux.
Rory - j'ai édité le sql pour calculer l'utc correctement lorsque les fuseaux horaires ne sont pas des heures entières, mais je ne peux pas voir quelque chose de mal avec le calcul lorsque le décalage est moins de voir les résultats ci-dessus
Oui, j'ai trouvé que la page d'aide de google. Impossible de trouver mon format en il y bien que.
Une chose à noter est que votre SUBSTRING() supprime le procès-verbal de la composante de l'fuseau horaire, sens il être incorrecte dans les fuseaux horaires qui ne sont pas des heures entières par rapport à l'heure UTC. par exemple, en Inde, qui est UTC+5:30.
ah, aussi, si le format est quelque chose comme 2005-08-08T00:00:00-01:00, c'est à dire le décalage est moins à la place de la positif, votre résultat sera faux.
Rory - j'ai édité le sql pour calculer l'utc correctement lorsque les fuseaux horaires ne sont pas des heures entières, mais je ne peux pas voir quelque chose de mal avec le calcul lorsque le décalage est moins de voir les résultats ci-dessus
OriginalL'auteur Colin | 2012-04-24
Vous devez vous connecter pour publier un commentaire.
Dans SQL Server 2008 vous pouvez utiliser le
datetimeoffset
type de données.De sortie:
Dans SQL Server 2005 et plus tôt vous pouvez calculer la date de l'heure UTC et l'offset:
De sortie:
Bien sûr, vous avez raison. Je ne peut pas convertir toutes les informations dans la chaîne directement à un DateTime. Le fuseau horaire doit être stocké ailleurs (si c'est nécessaire)
Ok. J'ai ajouté une solution pour SQL Server 2005
Wow! Il y a beaucoup de choses ici, mais la principale chose que je viens de réaliser, c'est que @bluefeet et j'ajoute le fuseau horaire, alors que nous devrions être en soustrayant!
OriginalL'auteur Anthony Faull
Vous pouvez faire un vraiment laid, où vous obtenez la date de la première, puis obtenir le temps et ajouter le décalage de l'heure:
ou une version consolidée:
si vous n'avez pas besoin de l'offset, puis:
Et c'est une nouvelle façon de faire: SÉLECTIONNEZ DateAdd(heure, Cast(substring(@d, 21, 2) comme int), de CONVERTIR(datetime, à GAUCHE(@d, 19) ,127)). Je vous suggère de modifier votre réponse...
J'ai mis à jour ma réponse à la modifier.
Les états de l'un est celui que j'ai utilisé. Il convertit l'heure GMT pour le stockage dans la base de données (je perds le fuseau horaire qu'il a été défini, mais c'est ok). Merci
Être prudent ici. La version consolidée doit soustraire le décalage, pas de l'ajouter
OriginalL'auteur Taryn
Son ISO8601 avec le temps, la zone Z
utilisation
voir
MSDN Explication
EDIT:
Je pense qu'il quelque chose à faire avec la zone sur la fin j'ai d'abord supposé tSql l'accepterait mais qui est en fait il l'habitude.
Wow c'est étrange compte tenu `SELECT CONVERT(date,'2005-08-08T00:00:00+01:00',127) fonctionne
fait changer toujours en train de vérifier le pourquoi de la zone de travail dont
J'attends une date de travail, car il ignore le fuseau horaire lorsque datetime ne fonctionne pas, et que je devrais avez spécifié Sql Server 2005. De Type "date" n'est pas défini le type de système." en 2005
Bien que le lien ci-dessus mentionne quelque chose au sujet de l'127 type, mais n'indique pas qu'il ne serait pas convertir datetime...
OriginalL'auteur AbstractChaos
Par la réponse choisie, datetimeoffset est une bonne solution. Attention cependant à côté de sql server avec des fonctions intégrées.
(J'ai essayé de les coller dans un commentaire de l'accepté de répondre, mais il ne serait pas le format de l'exemple de code)
En fait, ce que j'essayais de démontrer, c'est que GETDATE() converti avec datetimeoffset s'applique 00:00 au lieu de le bon fuseau horaire de format. Vous pouvez utiliser datediff entre GETDATE() et GETUTCDATE() et de construire la chaîne manuellement, mais on pourrait penser que SQL Server serait en mesure de gérer le décalage correctement dans la conversion lors de l'utilisation de convertir avec le mode 127.
Sql server ne peut pas en déduire le décalage lors de la conversion à partir d'un datetime datetimeoffset parce que l'information n'est pas stockée dans la structure datetime. Vous avez besoin de la SYSDATETIMEOFFSET() fonction. Voir stackoverflow.com/a/8634229/150342
Apprendre quelque chose de nouveau tous les jours 🙂 je n'étais pas au courant de cette fonction, mais je vais sûrement l'utiliser dans le futur.
OriginalL'auteur Jim