Lucrul cu tabele calendar

Analiza seriilor de timp în SQL Server

Maham Faisal Khan

Senior Data Science Content Developer

Ce este un tabel calendar?

SELECT *
FROM dbo.Calendar;
DateKey Date Day DayOfWeek DayName ...
20000101 2000-01-01 1 7 Saturday ...
20000102 2000-01-02 2 1 Sunday ...
20000103 2000-01-03 3 2 Monday ...
Analiza seriilor de timp în SQL Server

Conținutul unui tabel calendar

Coloane generale

  • Date
  • Day Name
  • Is Weekend

An calendaristic

  • Luna calendaristică
  • Trimestrul calendaristic
  • Anul calendaristic

An fiscal

  • Săptămâna fiscală a anului
  • Trimestrul fiscal
  • Prima zi fiscală a anului

Coloane specializate

  • Numele sărbătorii
  • Detalii lunare
  • Săptămâna ISO a anului
Analiza seriilor de timp în SQL Server

Construirea unui tabel calendar

CREATE TABLE dbo.Calendar
(
    DateKey INT NOT NULL,
    [Date] DATE NOT NULL,
    [Day] TINYINT NOT NULL,
    DayOfWeek TINYINT NOT NULL,
    DayName VARCHAR(10) NOT NULL,
    ...
)
SELECT
    CAST(D.DateKey AS INT) AS DateKey,
    D.[DATE] AS [Date],
    CAST(D.[day] AS TINYINT) AS [day],
    CAST(d.[dayofweek] AS TINYINT) AS [DayOfWeek],
    CAST(DATENAME(WEEKDAY, d.[Date]) AS VARCHAR(10)) AS [DayName],
    ...
Analiza seriilor de timp în SQL Server

Utilizarea unui tabel calendar

SELECT
    c.Date
FROM dbo.Calendar c
WHERE
    c.MonthName = 'April'
    AND c.DayName = 'Saturday'
    AND c.CalendarYear = 2020
ORDER BY
    c.Date;
Date
2020-04-04
2020-04-11
2020-04-18
2020-04-25
Analiza seriilor de timp în SQL Server

Utilizarea unui tabel calendar

SELECT
    c.Date
FROM dbo.Calendar c
WHERE
    c.MonthName = 'April'
    AND c.DayName = 'Saturday'
    AND c.CalendarYear = 2020
ORDER BY
    c.Date;
Date
2020-04-04
2020-04-11
2020-04-18
2020-04-25
Analiza seriilor de timp în SQL Server

O notă despre APPLY()

SELECT
    FYStart =
        DATEADD(MONTH, -6,
            DATEADD(YEAR,
                DATEDIFF(YEAR, 0,
                    DATEADD(MONTH, 6, d.[date])), 0)),
    FiscalDayOfYear =
        DATEDIFF(DAY,
            DATEADD(MONTH, -6,
                DATEADD(YEAR,
                    DATEDIFF(YEAR, 0,
                        DATEADD(MONTH, 6, d.[date])), 0)), d.[Date]) + 1,
    FiscalWeekOfYear =
        DATEDIFF(WEEK,
            DATEADD(MONTH, -6,
                DATEADD(YEAR,
                    DATEDIFF(YEAR, 0,
                        DATEADD(MONTH, 6, d.[date])), 0)), d.[Date]) + 1
FROM dbo.Calendar d;
Analiza seriilor de timp în SQL Server

O notă despre APPLY()

SELECT
    fy.FYStart,
    FiscalDayOfYear = DATEDIFF(DAY, fy.FYStart, d.[Date]) + 1,
    FiscalWeekOfYear = DATEDIFF(WEEK, fy.FYStart, d.[Date]) + 1
FROM dbo.Calendar d
    CROSS APPLY
    (
        SELECT FYStart =
            DATEADD(MONTH, -6,
                DATEADD(YEAR,
                    DATEDIFF(YEAR, 0,
                        DATEADD(MONTH, 6, d.[date])), 0))
    ) fy;
Analiza seriilor de timp în SQL Server

Să exersăm!

Analiza seriilor de timp în SQL Server

Preparing Video For Download...