create table dst_utility(
dst_yr int primary key,
dst_to datetime,
dst_fr datetime
)
;
dateadd(hour, 2
, dbo.fn_OccurrenceOfDaynameInMonth(
@year
, @monthTo
, 'Sunday'
, @startOccurrence
, @startLastFirst
)
)
declare @monthTo tinyint
, @startOccurrence tinyint
, @startLastFirst tinyint
, @monthFr tinyint
, @endOccurrence tinyint
, @endLastFirst tinyint
, @year int
;
set @year = 2000
while (@year < 2100)
begin
-- handle change in DST laws / rules
if (@year < 2007)
begin
-- old dst for US / adjust by country
-- Start: First Sunday in April
set @monthTo = 4
set @startOccurrence = 1
set @startLastFirst = 0
-- End: Last Sunday in October
set @monthFr = 10
set @endOccurrence = 1
set @endLastFirst = 1
end
else
begin
-- new dst for US / adjust by country
-- Start: Second Sunday in March
set @monthTo = 3
set @startOccurrence = 2
set @startLastFirst = 0
-- End: First Sunday in November
set @monthFr = 11
set @endOccurrence = 1
set @endLastFirst = 0
end
-- insert new dst record
insert into dst_utility
select @year
, dateadd(hour, 2
, dbo.fn_OccurrenceOfDaynameInMonth(
@year
, @monthTo
, 'Sunday'
, @startOccurrence
, @startLastFirst
)
)
, dateadd(hour, 2
, dbo.fn_OccurrenceOfDaynameInMonth(
@year
, @monthFr
, 'Sunday'
, @endOccurrence
, @endLastFirst
)
)
-- increment year
set @year = @year + 1
end
select dst_year, dst_to, dst_fr
from dst_utility
with years( yr )
as
(
-- set base year
select 2000
union all -- cte recursion
-- add additional years
select yr + 1
from years
where yr + 1 < 2100
)
, dst_rules( yr
, monthTo, weekdayTo, occurrenceTo, lastFirstTo
, monthFr, weekdayFr, occurrenceFr, lastFirstFr
)
as
(
select yr
, case when yr < 2007 then 4 else 3 end, 1
, case when yr < 2007 then 1 else 2 end, 0
, case when yr < 2007 then 10 else 11 end, 1
, 1, case when yr < 2007 then 1 else 0 end
from years
)
-- insert new dst record
insert into dst_utility
select yr
, dateadd(hour, 2
, dbo.fn_OccurrenceOfDaynameInMonth(
yr
, monthTo
, weekdayTo
, occurrenceTo
, lastFirstTo
)
)
, dateadd(hour, 2
, dbo.fn_OccurrenceOfDaynameInMonth(
yr
, monthFr
, weekdayFr
, occurrenceFr
, lastFirstFr
)
)
from dst_rules
;
Presto, we did it!
Have a question about something in this article? You can receive help directly from the article author. Sign up for a free trial to get started.
Comments (0)