web-dev-qa-db-fra.com

Conversion de la date et de l'heure d'un fuseau horaire en fuseau horaire UTC à l'aide d'une requête SQL

J'ai une valeur datetime . Cette valeur datetime peut être dans n'importe quel fuseau horaire tel que "Heure normale de l'Est" ou "India Standard Time" ... Je veux convertir cette valeur datetime en fuseau horaire UTC en sql ..__ de timezone la valeur sera le paramètre donné . Je peux réaliser cela en utilisant aussi le code c #. Mais j'ai besoin de cela en requête SQL.

Quelqu'un peut-il me dire comment puis-je convertir cela?

4
user1934329

Le fuseau horaire et le décalage de fuseau horaire sont deux choses différentes. Un fuseau horaire peut avoir différents décalages si l'heure d'été est utilisée. La prise en charge du fuseau horaire a été ajoutée à SQL Server dans la dernière version, 2016. 

Votre question comporte deux parties: comment convertir une valeur datetime en une valeur avec offset/timezone, puis comment convertir cette valeur en UTC.

Dans les versions jusqu'à SQL Server 2014, vous devez déterminer à l'avance le bon décalage pour votre fuseau horaire local, par exemple à l'aide d'un code C #. Une fois que vous l'avez, vous pouvez convertir une datetime en `datetimeoffset avec un offset spécifique avec TODATETIMEOFFSET :

select TODATETIMEOFFSET(GETDATE(),'02:00')

ou 

select TODATETIMEOFFSET(GETDATE(),120)

Cela renverra une valeur datetimeoffset avec l'heure d'origine et le décalage spécifié.

La commutation sur un autre décalage (par exemple, UTC) est effectuée par la fonction SWITCHOFFSET

select SWITCHOFFSET(@someDateTimeOffset,0)

Vous pouvez combiner les deux avec 

select SWITCHOFFSET(TODATETIMEOFFSET(GETDATE(),120),0)

Le décalage peut être passé en paramètre. En supposant que votre champ s'appelle SomeTime, vous pouvez écrire

select SWITCHOFFSET(TODATETIMEOFFSET(SomeTime,@offsetInMinutes),0)

Dans SQL Server 2016, vous pouvez utiliser les noms de fuseau horaire. Cependant, vous avez toujours besoin d’une double conversion, d’abord au fuseau horaire local, puis au format UTC:

SELECT (getdate() at time zone 'Central Europe Standard Time') AT TIME ZONE 'UTC'

Le premier AT TIMEZONE renvoie une datetimeoffset avec un offset +2:00 et le second le convertit en UTC.

REMARQUE

Vous pourriez probablement éviter toutes les conversions si vous utilisiez le type datetimeinfo au lieu de datetime. SQL Server permet les comparaisons, le filtrage, les calculs, etc. sur les valeurs de différents décalages. Vous n'avez donc pas besoin de convertir les requêtes. Du côté du client, .NET a le type équivalent DateTimeOffset afin que vous n’ayez pas besoin de convertir le code client.

12
Panagiotis Kanavos

Si vous utilisez SQL Server 2016, vous pouvez utiliser la nouvelle clause AT TIME ZONE:

SELECT SalesOrderID, OrderDate,   
    OrderDate AT TIME ZONE 'Eastern Standard Time' AS OrderDate_TimeZoneEST,  
    OrderDate AT TIME ZONE 'Eastern Standard Time'   
    AT TIME ZONE 'UTC' AS OrderDate_TimeZoneUTC  
FROM Sales.SalesOrderHeader;  
1
Steve Ford