-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathUTCtoEasternDateTime
More file actions
48 lines (42 loc) · 2.21 KB
/
Copy pathUTCtoEasternDateTime
File metadata and controls
48 lines (42 loc) · 2.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
CREATE FUNCTION dbo.UTCtoEasternDateTime(@pUTCDateTime datetime)
RETURNS DATETIME
AS
BEGIN
DECLARE @vFirstOfDSTStartMonth DATETIME
DECLARE @vFirstOfDSTEndMonth DATETIME
DECLARE @vDSTStartDate DATETIME
DECLARE @vDSTEndDate DATETIME
DECLARE @vUTCtoLocalDateTime DATETIME
DECLARE @pStandardTimeOffset INTEGER
DECLARE @pDSTOffset INTEGER
--SET DATEFIRST 7 this does not work in functions
SET @pStandardTimeOffset = -5
SET @pDSTOffset = -4
IF YEAR(@pUTCDateTime) >= 2007
BEGIN
--calc first day of march from UTCDateTime
SET @vFirstOfDSTStartMonth = DATEADD(MONTH, 2, DATEADD(YEAR, YEAR(@pUTCDateTime) - 1900, 0))
--SET @vFirstOfDSTStartMonth = LTRIM(YEAR(@pUTCDateTime)) + '/03/01'
--calc first day of november from UTCDateTime
SET @vFirstOfDSTEndMonth = DATEADD(MONTH, 10, DATEADD(YEAR, YEAR(@pUTCDateTime) - 1900, 0))
--SET @vFirstOfDSTEndMonth = LTRIM(YEAR(@pUTCDateTime)) + '/11/01'
SET @vDSTStartDate = DATEADD(HOUR, 2, DATEADD(day,( ( 15 - DATEPART(dw, @vFirstOfDSTStartMonth ) ) % 7 )+ 7, @vFirstOfDSTStartMonth ))
SET @vDSTEndDate = DATEADD(HOUR, 2, DATEADD(day, ( ( 8 - DATEPART(dw, @vFirstOfDSTEndMonth) ) % 7 ), @vFirstOfDSTEndMonth))
END
ELSE
BEGIN
--calc first sunday of april from UTCDateTime
--SET @vFirstOfDSTStartMonth = LTRIM(YEAR(@pUTCDateTime)) + '/04/01'
SET @vFirstOfDSTStartMonth = DATEADD(MONTH, 3, DATEADD(YEAR, YEAR(@pUTCDateTime) - 1900, 0))
SET @vDSTStartDate = DATEADD(HOUR, 2, DATEADD(day, ( ( 8 - DATEPART(dw, @vFirstOfDSTStartMonth) ) % 7 ), @vFirstOfDSTStartMonth))
--calc last sunday of october from UTCDateTime
--SET @vFirstOfDSTEndMonth = LTRIM(YEAR(@pUTCDateTime)) + '/10/01'
SET @vFirstOfDSTEndMonth = DATEADD(MONTH, 9, DATEADD(YEAR, YEAR(@pUTCDateTime) - 1900, 0))
SET @vDSTEndDate = DATEADD(day,DATEDIFF(day,'19000107',DATEADD(month,DATEDIFF(MONTH,0,@vFirstOfDSTEndMonth),30))/7*7,'19000107')
END
IF @pUTCDateTime BETWEEN @vDSTStartDate AND @vDSTEndDate
SET @vUTCtoLocalDateTime = DATEADD(hour, @pDSTOffset, @pUTCDateTime)
ELSE
SET @vUTCtoLocalDateTime = DATEADD(hour, @pStandardTimeOffset, @pUTCDateTime)
RETURN @vUTCtoLocalDateTime
END