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?
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.
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;