2012-11-19 37 views
2

嗨,SQL Server上有一個函數可以識別夏令時是否激活。在SQL Server上處理夏令時

其中我創建了一個標量函數,可以將服務器時間轉換爲在插入/更新時使用應用程序的工廠位置時間。

問題是我不知道在美國有DST。所以我的計劃,我會做這樣的事情

if DST is active 
    // -1 
else 
    // + 1 
end 

,我需要檢查,如果DST是主動或不

任何想法嗎?

感謝和問候

+1

當多個時區都參與其中,我通常建議存儲所有'datetime's爲UTC,並做客戶端的任何必要的轉換軟件。 –

回答

1

處理夏令時間功能:

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

「只有鏈接」的答案往往會令人不悅。無法保證鏈接仍然有效(明年,明天,明年) –

+0

感謝您的指導。 –