convertir datetime en valeur UTC mssql

J'ai la requête comme ceci:

SELECT table.a, table.b, table.c from Table table 

Comment puis-je convertir "table.b" en heure UTC juste en ajoutant CAST dans la requête?

 SELECT table.a, **%CAST_TO_UTC_FUNCTION to table.b%**, table.c from Table table 

Je ne suis pas capable de le lancer séparément et de déclarer des variables locales.

Vous pouvez écrire votre requête comme suit:

 SELECT table.a, dateAdd( second, dateDiff(second, getDate(), getUtcDate()), table.b) as b_converted_to_UTC, table.c from Table table 

Cela convertit les valeurs de la colonne b en UTC, en ajoutant à ces valeurs la différence tmie qui existe actuellement entre la date locale ( getDate() ) et la date UTC ( getUtcDate() ).

Pour que la requête ci-dessus fonctionne, les conditions suivantes doivent être remplies:

  • la date (s) stockée dans la colonne b doit être exprimée en heure locale
  • la date et le timezone du server doivent être correctement configurés

J'ai résolu le problème en créant une table temporaire qui stocke la plage de dates et le décalage UTC actuel. Voici la solution partielle qui fonctionne pour les États-Unis à partir de l'année 2007, pour les régions qui observent la DST. Il peut être facilement modifié pour des années avant 2007. S'il vous plaît voir la fin de la solution pour un exemple d'utilisation

  -- GET UTC for time in US for region that observe Daylight Saving Time (meaning will not work for part of Arizona and Hawaii) DECLARE @DSTStartDay datetime = '2007-03-1 02:00:00', @DSTEndDay datetime = '2007-11-1 02:00:00', @i int = 0, @currDate datetime, @offset int DECLARE @DST TABLE (StartDate datetime, EndDate datetime, DSTOffset int) -- Insert into @DST DSTOffset of 0 if not DST date range, and -1 if DST date as temporary offset value -- Then when we get Time Zone Offset, we can update DSTOffset to actual current offset (hours) WHILE @i < 20 BEGIN INSERT @DST SELECT DATEADD(d, 15 - CASE DATEPART(dw, @DSTStartDay) WHEN 1 THEN 8 ELSE DATEPART(dw, @DSTStartDay) END, @DSTStartDay), DATEADD(d, 8 - CASE DATEPART(dw, @DSTEndDay) WHEN 1 THEN 8 ELSE DATEPART(dw, @DSTEndDay) END, @DSTEndDay), -1; SET @DSTStartDay = DATEADD(yy,1,@DSTStartDay) INSERT @DST SELECT DATEADD(d, 8 - CASE DATEPART(dw, @DSTEndDay) WHEN 1 THEN 8 ELSE DATEPART(dw, @DSTEndDay) END, @DSTEndDay), DATEADD(d, 15 - CASE DATEPART(dw, @DSTStartDay) WHEN 1 THEN 8 ELSE DATEPART(dw, @DSTStartDay) END, @DSTStartDay), 0; SET @DSTEndDay = DATEADD(yy,1,@DSTEndDay) SET @i = @i + 1 END -- Get temporary offset for current date SET @currDate = GETDATE() SELECT @Offset = DSTOffset FROM @DST WHERE StartDate < @currDate AND EndDate >= @currDate -- Calculate Time Zone Offset (ignore DST) and update DSTOffset in @DST table from temporary to actual offset SET @Offset = DATEDIFF(hh, GETDATE(), GETUTCDATE()) - @Offset UPDATE @DST SET DSTOffset = DSTOffset + @Offset --SELECT * FROM @DST - look at the table --Sample usage DECLARE @myDateNoDST datetime = '2014-03-08 06:00', @myDateWithDST datetime = '2014-03-09 06:00' SELECT @myDateNoDST LocalDateNoDST, (SELECT DATEADD(hh,DSTOffset,@myDateNoDST) FROM @DST d WHERE StartDate < @myDateNoDST AND EndDate >= @myDateNoDST) UTCDateNoDST, @myDateWithDST LocalDateWithDST, (SELECT DATEADD(hh,DSTOffset,@myDateWithDST) FROM @DST d WHERE StartDate < @myDateWithDST AND EndDate >= @myDateWithDST) UTCDateWithDST