Search code examples
sql-serversql-server-2008stored-proceduresdst

Check whether daylight savings is on or off


In a scenario, I have to check whether daylight savings is in effect or not. Based on the outcome of the check, I have to do some calculations in a SQL server procedure.

What is the best way to quickly check if daylight savings is currently in effect?


Solution

  • I used this Daylight Savings Time Functions in SQL Server that is created by Tim Cullen.

    Specifically, the code that I used was:

    Start Date Function

    CREATE function [dbo].[fn_GetDaylightSavingsTimeStart]
    (@Year varchar(4))
    RETURNS smalldatetime
    as
    begin
    declare @DTSStartWeek smalldatetime, @DTSEndWeek smalldatetime
    set @DTSStartWeek = '03/01/' + convert(varchar,@Year)
    return case datepart(dw,@DTSStartWeek)
    when 1 then
    dateadd(hour,170,@DTSStartWeek)
    when 2 then
    dateadd(hour,314,@DTSStartWeek)
    when 3 then 
    dateadd(hour,290,@DTSStartWeek)
    when 4 then 
    dateadd(hour,266,@DTSStartWeek)
    when 5 then 
    dateadd(hour,242,@DTSStartWeek)
    when 6 then 
    dateadd(hour,218,@DTSStartWeek)
    when 7 then
    dateadd(hour,194,@DTSStartWeek)
    end
    end
    

    End Date Function

    CREATE function [dbo].[fn_GetDaylightSavingsTimeEnd]
    (@Year varchar(4))
    RETURNS smalldatetime
    as
    begin
    declare @DTSEndWeek smalldatetime
    set @DTSEndWeek = '11/01/' + convert(varchar,@Year)
    return case datepart(dw,dateadd(week,1,@DTSEndWeek))
    when 1 then
    dateadd(hour,2,@DTSEndWeek)
    when 2 then
    dateadd(hour,146,@DTSEndWeek)
    when 3 then
    dateadd(hour,122,@DTSEndWeek)
    when 4 then
    dateadd(hour,98,@DTSEndWeek)
    when 5 then 
    dateadd(hour,74,@DTSEndWeek)
    when 6 then 
    dateadd(hour,50,@DTSEndWeek)
    when 7 then 
    dateadd(hour,26,@DTSEndWeek)
    end
    end
    

    I then use the functions like this in my query:

    declare @DLSStart smalldatetime 
    , @DLSEnd smalldatetime 
    , @DLSActive tinyint 
    set @DLSStart = (select MSSQLTIPS.dbo.fn_GetDaylightSavingsTimeStart(convert(varchar,datepart(year,getdate()))))
    set @DLSEnd = (select MSSQLTIPS.dbo.fn_GetDaylightSavingsTimeEnd(convert(varchar,datepart(year,getdate())))) 
    
    if @Date between @DLSStart and @DLSEnd 
    begin 
    set @DLSActive = 1 
    end 
    else 
    begin 
    set @DLSActive = 0 
    end 
    select @DLSActive