sql-server - 检查夏令时是否开启或关闭

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

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

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

最佳答案

我用过这个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

关于sql-server - 检查夏令时是否开启或关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15564067/

相关文章:

c# - 具有弹性池的 Entity Framework 。如何管理我的 SaaS 客户数据库?

sql - 使用 SQL 序数位置表示法的好处?

sql-server - 如何导入 SDF 文件

sql-server - SQL Server View 需要很长时间才能更改,但查询本身会快速完成?

oracle - 在 PL-SQL block 中声明和使用 PROCEDURE

mysql - 是否可以使用MySQL在存储过程中动态创建表的名称?

c# - 如何将表值参数从 .net 代码传递给存储过程

sql - 需要在明细表中找到有不同明细的Id

sql-server - 如何从 SQL Server 中的图表创建备份脚本?

sql - 使用从另一列填充的数据更改表添加列