Расчет, если дата находится в пределах BST - SQL Server - PullRequest
0 голосов
/ 28 февраля 2019

Я строю измерение даты, и последняя часть, которую мне нужно сделать, это заполнить флаг, который указывает, попадает ли дата в британское летнее время.Британское летнее время начинается с ПОСЛЕДНЕГО воскресенья марта и заканчивается в ПОСЛЕДНЕЕ воскресенье октября.Пока у меня есть это:

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

1 Ответ

0 голосов
/ 28 февраля 2019

Вы можете попробовать создать набор с правильным началом / концом для каждого года, а затем использовать это как ссылку с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...