【问题标题】:Check whether daylight savings is on or off检查夏令时是打开还是关闭
【发布时间】:2013-03-11 22:32:30
【问题描述】:

在一个场景中,我必须检查夏令时是否有效。根据检查结果,我必须在 SQL 服务器过程中进行一些计算。

快速检查夏令时当前是否有效的最佳方法是什么?

【问题讨论】:

  • 你的意思是DST是在服务器上生效还是在其他给定的时区生效?
  • 是的,想在服务器上查看
  • 如果时区(包括 DST 转换)在数据库中开始变得重要,这通常对我来说是一个信号,表明数据库应该只以 UTC 存储所有内容。

标签: sql-server sql-server-2008 stored-procedures dst


【解决方案1】:

我使用了由 Tim Cullen 创建的 Daylight Savings Time Functions in SQL Server

具体来说,我使用的代码是:

开始日期功能

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

结束日期函数

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

然后我在查询中使用这样的函数:

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

【讨论】:

    【解决方案2】:

    在西欧,夏令时从 3 月的最后一个星期日 02:00 开始

    select 
    DATEADD(
        day,
        DATEDIFF(
            day,
            '1900-01-07',
            DATEADD(month,DATEDIFF(MONTH,0,concat(year(getdate()),'-03-01')),30)
            )/7*7,
        '1900-01-07 02:00'
        ) as SummerTimeStarts
    

    10 月的最后一个星期日 03:00 结束

    Select 
    DATEADD(
        day,
        DATEDIFF(
            day,
            '1900-01-07',
            DATEADD(month,DATEDIFF(MONTH,0,concat(year(getdate()),'-10-01')),30)
            )/7*7,
        '1900-01-07 03:00'
        ) as SummerTimeEnds
    

    它给出了 en 函数:

    CREATE function [dbo].[DateIsSummerTime]
    (@datetime datetime)
    RETURNS bit
    as
    begin
        declare @SummerTimeStarts datetime, @SummerTimeEnds datetime
        set @SummerTimeStarts = (select DATEADD(day,DATEDIFF(day,'1900-01-07',DATEADD(month,DATEDIFF(MONTH,0,concat(year(getdate()),'-03-01')),30))/7*7,'1900-01-07 02:00'))
        set @SummerTimeEnds   = (Select DATEADD(day,DATEDIFF(day,'1900-01-07',DATEADD(month,DATEDIFF(MONTH,0,concat(year(getdate()),'-10-01')),30))/7*7,'1900-01-07 03:00')) 
    
        Return  Case when @datetime > @SummerTimeStarts and @datetime < @SummerTimeEnds then 1 else 0 end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 2015-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多