【问题标题】:Calculating if date is within BST - SQL Server计算日期是否在 BST 内 - SQL Server
【发布时间】:2019-07-22 09:00:03
【问题描述】:

我正在构建一个日期维度,我需要做的最后一部分是填充一个标志,表明日期是否属于英国夏令时。英国夏令时从 3 月的最后一个星期日开始,到 10 月的最后一个星期日结束。到目前为止,我得到了这个:

update [Dim_Date_Test_BST]
set IsBST = 1
where (CalenderMonth BETWEEN 03 and 10)

我还有以下代码,列出了每个月的最后一个星期日:

dateadd(dd,(datediff(dd,'17530107',dateadd(mm,datediff(mm,-1,Date),-1))/7)*7,'17530107')

我正在努力将这两段代码结合起来以产生我需要的结果。有任何想法吗?谢谢。

修复,感谢下面的贡献者:

SELECT DISTINCT
        CalenderYear = D.CalenderYear,
        BritishSummerStartDate = 
        CASE 
            WHEN D.CalenderMonth = 3 
            THEN dateadd(dd,(datediff(dd,'17530107',dateadd(mm,datediff(mm,-1,D.Date),-1))/7)*7,'17530107') 
        END,
        BritishSummerEndDate = CASE 
            WHEN D.CalenderMonth = 10 
            THEN dateadd(dd,(datediff(dd,'17530107',dateadd(mm,datediff(mm,-1,D.Date),-1))/7)*7,'17530107') 
        END
INTO #BST
FROM [dbo].[Dim_Date_Test_BST] AS D
WHERE D.CalenderMonth IN (3, 10)


update D 
SET IsBST = 1
FROM[dbo].[Dim_Date_Test_BST] AS D
INNER JOIN #BST a ON d.CalenderYear = a.CalenderYear AND a.BritishSummerStartDate IS NOT NULL
INNER JOIN #BST b ON d.CalenderYear = b.CalenderYear AND b.BritishSummerEndDate IS NOT NULL
WHERE D.Date BETWEEN a.BritishSummerStartDate AND b.BritishSummerEndDate

【问题讨论】:

    标签: sql sql-server tsql date dimensional-modeling


    【解决方案1】:

    您可以尝试在每年之前生成具有正确开始/结束的集合,然后将其用作BETWEEN 的参考。

    ;WITH BritishSummerPeriodsByYear AS
    (
        SELECT DISTINCT
            CalenderYear = D.CalenderYear,
            BritishSummerStartDate = CASE 
                WHEN D.CalenderMonth = 3 
                THEN dateadd(dd,(datediff(dd,'17530107',dateadd(mm,datediff(mm,-1,D.Date),-1))/7)*7,'17530107') END,
            BritishSummerEndDate = CASE 
                WHEN D.CalenderMonth = 10 
                THEN dateadd(dd,(datediff(dd,'17530107',dateadd(mm,datediff(mm,-1,D.Date),-1))/7)*7,'17530107') END
        FROM
            [Dim_Date_Test_BST] AS D
        WHERE
            D.CalenderMonth IN (3, 10)
    )
    update D SET
        IsBST = 1
    FROM
        Dim_Date_Test_BST AS D
        INNER JOIN BritishSummerPeriodsByYear AS BP ON D.CalenderYear = BP.CalenderYear
    WHERE
        D.Date BETWEEN BP.BritishSummerStartDate AND BP.BritishSummerEndDate
    

    【讨论】:

    • 谢谢 - 我最终采用了这段代码并对其进行了调整。非常感谢你的帮助! :)
    【解决方案2】:

    有一种更简单的方法,根据我们是否在 BST 中返回 1 或 0。

    SUBSTRING(REVERSE(<your date> AT TIME ZONE 'GMT Standard Time'), 4,1) AS IsBST
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-17
      • 2021-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多