Skip to content

Instantly share code, notes, and snippets.

@pimbrouwers
Last active October 29, 2021 14:25
Show Gist options
  • Save pimbrouwers/88ee74777d6caa24e78dc39db311b8d2 to your computer and use it in GitHub Desktop.
Save pimbrouwers/88ee74777d6caa24e78dc39db311b8d2 to your computer and use it in GitHub Desktop.
SQL Server Convert UTC to EST/EDT (Eastern Daylight Time)
/*** fn_utc_to_edt ***/
IF NOT EXISTS (SELECT 1
FROM [INFORMATION_SCHEMA].[ROUTINES]
WHERE [ROUTINE_NAME] = 'fn_utc_to_edt'
AND [ROUTINE_TYPE] = 'FUNCTION')
BEGIN
EXEC('CREATE FUNCTION [dbo].[fn_utc_to_edt]() RETURNS INT AS BEGIN RETURN 1 END')
END;
GO
ALTER FUNCTION [dbo].[fn_utc_to_edt] (@utc DATETIME)
RETURNS DATETIME
AS
BEGIN
-- Convert UTC to EST accouting for EDT/DST
DECLARE @edt DATETIME;
SET @edt = DATEADD(
hh,
CASE
WHEN YEAR(@utc) <= 2006 THEN
CASE
WHEN @utc >= '4/' + CAST((8 - DATEPART(dw, '4/1/' + CAST(YEAR(@utc) AS VARCHAR))) % 7 + 1 AS VARCHAR) + '/' + CAST(YEAR(@utc) AS VARCHAR) + ' 7:00'
AND @utc < '10/' + CAST(32 - DATEPART(dw, '10/31/' + CAST(YEAR(@utc) AS VARCHAR)) AS VARCHAR) + '/' + CAST(YEAR(@utc) AS VARCHAR) + ' 6:00'
THEN -4
ELSE -5
END
ELSE
CASE
WHEN @utc >= '3/' + CAST((8 - DATEPART(dw, '3/1/' + CAST(YEAR(@utc) AS VARCHAR))) % 7 + 8 AS VARCHAR) + '/' + CAST(YEAR(@utc) AS VARCHAR) + ' 7:00'
AND @utc < '11/' + CAST((8 - DATEPART(dw, '11/1/' + CAST(YEAR(@utc) AS VARCHAR))) % 7 + 1 AS VARCHAR) + '/' + CAST(YEAR(@utc) AS VARCHAR) + ' 6:00'
THEN -4
ELSE -5
END
END,
@utc);
RETURN @edt;
END;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment