Cette question est un suivi de cette question. J'ai une colonne d'heure UTC et je veux convertir en l'heure locale actuelle (Central Time Zone or America/Chicago)
. J'ai essayé d'utiliser la fonction de la réponse @Ron Smith, qui est la fonction [dbo].[fn_UTC_to_DST]
.Heure UTC au fuseau horaire local (heure du Centre) Conversion MS SQL Server
Dans cette fonction, il a besoin de deux arguments tels que l'heure UTC et le décalage. Je saisis les deux comme ceci,
SELECT dbo.fn_UTC_to_DST([time(UTC)],5) as Date
FROM tbl
Comme nous sommes en mode Day Light Saving, j'utilise 5 comme offset. Ma sortie ressemble à ceci,
2017-09-27 20:55:00.000
2017-09-27 20:56:00.000
2017-09-27 20:57:00.000
2017-09-27 20:58:00.000
...
Ce qui devrait être (heure centrale),
2017-09-27 09:55:00.000
2017-09-27 09:56:00.000
2017-09-27 09:57:00.000
2017-09-27 09:58:00.000
...
Alors, je l'ai changé la fonction de @Ron Smith comme celui-ci,
CREATE FUNCTION [dbo].[fn_UTC_to_DST]
(
@UTC datetime,
@StandardOffset int
)
RETURNS datetime
AS
BEGIN
declare
@DST datetime,
@SSM datetime, -- Second Sunday in March
@FSN datetime -- First Sunday in November
-- get DST Range
set @SSM = datename(year,@UTC) + '0314'
set @SSM = dateadd(hour,-5,dateadd(day,datepart(dw,@SSM)*-1+1,@SSM)) -- Changed from 2 to -5
set @FSN = datename(year,@UTC) + '1107'
set @FSN = dateadd(second,-6,dateadd(hour,2,dateadd(day,datepart(dw,@FSN)*-1+1,@FSN))) -- changed from 1 to -6
-- add an hour to @StandardOffset if @UTC is in DST range
if @UTC between @SSM and @FSN
set @StandardOffset = @StandardOffset + 1
-- convert to DST
set @DST = dateadd(hour,@StandardOffset,@UTC)
-- return converted datetime
return @DST
END
GO
Cependant, cela reste me donne le même résultat que ci-dessus. 1. Que dois-je changer pour l'heure du Centre? 2. Y a-t-il un moyen de passer automatiquement à -5 pendant l'heure d'été et -6 pendant l'heure d'hiver?
EDIT:
Après avoir examiné la réponse et la reference link de # Siyual, j'ai créé la table dbo.TZCalendar
et j'ai essayé de créer une fonction comme celui-ci (prend un argument et renvoie une date de lien refrence)
CREATE FUNCTION dbo.ConvertUTCToLocal
(
@utc DATETIME
)
RETURNS Datetime
AS BEGIN
SELECT UTCToLocal = DATEADD(HOUR, CASE
-- within Daylight Savings Time
WHEN @utc >= UTC_DST_Start AND @utc < UTC_DST_End
THEN -5
-- within Standard Time
ELSE -6 END, @utc)
FROM dbo.TZCalendar
WHERE CONVERT(DATE,@utc) >= [Year]
AND CONVERT(DATE,@utc) < DATEADD(YEAR, 1, [Year])
END
GO
Cela ne fonctionne pas. La logique semble juste pour moi, mais, j'ai juste besoin d'une fonction sans SCHEMABINDING
(ce qui est fait dans le lien de référence). Comment puis je faire ça?
double possible de [Sql Server Spécifiez le temps dans un autre fuseau horaire] (https://stackoverflow.com/questions/30919935/sql-server-specify-time-in-another-timezone) – Siyual
@Siyual merci pour le lien. J'ai une question, dans mon article, comme je l'ai mentionné (formulaire # Ron's answer), y a-t-il un moyen de faire automatiquement les économies de l'heure d'été sans avoir à entrer le décalage manuellement? –
La réponse liée prend en compte DST. Vous avez juste besoin de changer les colonnes 'ET' en' CT' et de changer les offsets de '-4' et' -5' en '-5' et' -6'. – Siyual