2017-10-20 54 views
2

J'ai une table SQL avec datetime2 objets, et ils sont stockés dans UTC TIMETSQL conversion Date

par exemple

UTC_TIME = 2017-10-20T13:16:14.6950000 

J'ai réussi à convertir cet horodatage à l'heure locale en utilisant

SELECT UTC_TIME AT TIME ZONE 'W. Europe Standard Time' AS LOCAL_TIME 

la sortie de ce qui précède est

2017-10-20T13: 16: 14,6950000 + 02: 00

Ceci est correct, mais la sortie que je veux est

2017-10-20T15: 16: 14,6950000

Le décalage doit être ajouté à mon horodatage.

Y at-il un moyen facile de faire cela? Un événement a été enregistré à l'heure UTC 2017-10-20T13: 16: 14.6950000 Je suis en Europe de l'Ouest, et pour l'instant il y a un décalage de 2 heures. Donc, l'heure locale est 2017-10-20T15: 16: 14,6950000

je voudrais convertir l'heure UTC (13h16), de sorte que le résultat est 15:16

La requête est exécutée sur un serveur qui s'exécute dans le fuseau horaire UTC.

+0

double possible de [Comment puis-je convertir un Sql Server 2008 DateTimeOffset à un DateTime] (https: // stackoverflow.com/questions/4953903/how-can-i-convert-a-sql-server-2008-datetimeoffset-to-a-datetime) – Igor

Répondre

0

AU TEMPS ZONE retourne un DateTimeOffset vous pouvez utiliser CONVERT avec option 1.

DECLARE @UTC_TIME DATETIME2(7) = '2017-10-20T13:16:14.6950000' 

SELECT CONVERT(datetime2, (@UTC_TIME AT TIME ZONE 'Pacific Standard Time'), 1) AS OrderDate_TimeZonePST 

Voir aussi CAST and CONVERT (Transact-SQL)

+0

Cela ne fonctionne pas :: DECLARE UTC_TIME DATETIME2 (7) = '2017-10-20T13: 16: 14,6950000' SELECT UTC_TIME T0, UTC_TIME AT W. » TIME ZONEEurope Standard Time 'AS T1, CONVERT (datetime2, (UTC_TIME AU FUSEAU HORAIRE' W. Europe Standard Time '), 1) AS T2 réponse Je suis de retour est T0: 2017-10-20T13: 16: 14.6950000, T1: 2017-10-20T13: 16: 14.6950000 + 02: 00, T2: 2017-10-20T11: 16: 14.6950000, mais la valeur expexée est 2017-10-20T15: 16: 14.6950000 (comme je le ferais lire sur une horloge locale) – Kermit754

0

Vous pouvez le faire en utilisant sysdatetimeoffset

declare @UTC_Time datetime2 = '2017-10-20T13:16:14.6950000' 

Select dateadd(minute, datepart(TZoffset, sysdatetimeoffset()), @UTC_Time) 
+0

Cela ne fonctionne pas non plus, car le serveur SQL s'exécute dans le cloud, dans le fuseau horaire UTC ... – Kermit754

0

Cela semble la manière Pour ce faire:

DECLARE @UTC_TIME DATETIME2(7) = '2017-10-20T13:16:14.6950000' 

    SELECT 
    @UTC_TIME AS T0, 
    @UTC_TIME AT TIME ZONE 'W. Europe Standard Time' AS T1, 
    dateadd(minute,DATEdiff(minute,@UTC_TIME AT TIME ZONE 'W. Europe Standard Time',@UTC_TIME),@UTC_TIME) as T2 

Le résultat est T0: 2017-10-20T13: 16: 14,6950000

T1: 2017-10-20T13: 16: 14,6950000 + 02: 00

T2: 2017-10-20T15: 16: 14,6950000

T2 est ce que nous verrions sur l'horloge locale pour un événement qui se passe à l'heure UTC T0