sql - 计算日期是否在 BST 内 - SQL Server

标签 sql sql-server tsql date dimensional-modeling

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

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

最佳答案

您可以尝试在每年生成一个具有正确开始/结束时间的集合,然后将其用作带有 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

关于sql - 计算日期是否在 BST 内 - SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54925803/

相关文章:

java - 无法删除或更新父行 - Java

sql - join 语句中的别名问题

sql-server - 如何将 float 数组传递给 SQL Server 存储过程?

sql - 如何在 SQL Server 中有效地合并两个层次结构?

javascript - 为菜单系统编写 SQL 查询

.net - 如何向 sql View 添加主键? - 或者将 View 链接到 LINQ-2-Entities 的替代方法

SQL:GROUP BY 之后的 SUM

MySQL Sum 不正确并加入

sql - 在sql server中使用isnumeric捕获异常

sql - 在 SQL 中返回包含 IN 子句中所有值的记录