确定特定DateTime是否在DST中

时间:2014-05-21 15:53:17

标签: tsql

鉴于特定的DateTime,并且仅使用SQL,我如何确定夏令时是否会在当天生效?这纯粹是为了本地"使用,所以我不需要担心它在不同的环境或语言环境中工作,只需要我自己的SQL Server 2008R2服务器。

所以,例如,

declare @myDate datetime='2 Jun 2014 14:00'

然后以某种方式评估@myDate将返回一个结果,表明"是的,这是在DST",其中为

declare @myDate datetime='2 Dec 2014 14:00'

...将是"不,这不是DST"。

指定的日期时间仅限于工作时间(上午8点至晚上8点),因此我并不太关心“#34;之间的价值”。 DST和非DST。我在英国,在UTC和UTC + 1之间。

2 个答案:

答案 0 :(得分:0)

似乎在这里回答:

Get Time zones in SQL Server 2008 R2

基本上,您需要将Olson时区数据库或其某些子集加载到SQL Server数据库中,然后才能使用SQL访问它。

答案 1 :(得分:0)

我拼凑了以下代码,这使得(英国)假设DST在3月的最后一个星期日开始,并在10月的最后一个星期日结束。它对我的要求非常具体,但似乎可以胜任 - 如果有人知道更优雅的解决方案......

declare @myDate datetime='2 Jun 2014'

-- Declare October in this year
declare @october datetime=DATEADD(month,9, DATEADD(yy, DATEDIFF(yy,0,@myDate), 0))

-- Declare March in this year
declare @march datetime=DATEADD(month,3, DATEADD(yy, DATEDIFF(yy,0,@myDate), 0))

-- Find last Sunday in March
declare @DSTStart datetime=DATEADD(dd,
        -DATEPART(WEEKDAY,
                  DATEADD(dd, -DAY(DATEADD(mm, 1, @march)),
                          DATEADD(mm, 1, @march))) + 1,
        DATEADD(dd, -DAY(DATEADD(mm, 1, @march)), DATEADD(mm, 1, @march)))

-- Find last Sunday in October
declare @DSTEnd datetime= DATEADD(dd,
        -DATEPART(WEEKDAY,
                  DATEADD(dd, -DAY(DATEADD(mm, 1, @october)),
                          DATEADD(mm, 1, @october))) + 1,
        DATEADD(dd, -DAY(DATEADD(mm, 1, @october)), DATEADD(mm, 1, @october)))

if (@mydate BETWEEN @DSTStart and @DSTEnd) print 'DST'