【问题标题】:Nested Hierarchy to Calculated Date嵌套层次结构到计算日期
【发布时间】:2022-01-03 14:50:25
【问题描述】:

我正在尝试从货币假日表转换嵌套层次结构,以选择 2022 年的特定日期。

解释示例源表:

+---------+---------------+---------------+-------------------------+------------+-----------+-------------+
| hol_ccy | holiday       | date_type     | hol_dt                  | hol_day_no | calloc_id | base_hol_id |
+---------+---------------+---------------+-------------------------+------------+-----------+-------------+
| CHF     | Good Friday   | Date          | 2022-04-15 00:00:00.000 | 0          | 9169      | NULL        |
+---------+---------------+---------------+-------------------------+------------+-----------+-------------+
| CHF     | Easter Monday | Ordinal Based | 1899-12-30 00:00:00.000 | 3          | 9188      | 9169        |
+---------+---------------+---------------+-------------------------+------------+-----------+-------------+
| CHF     | Easter        | Ordinal Based | 1899-12-30 00:00:00.000 | 2          | 9189      | 9169        |
+---------+---------------+---------------+-------------------------+------------+-----------+-------------+
| CHF     | Ascension     | Ordinal Based | 1899-12-30 00:00:00.000 | 39         | 9190      | 9189        |
+---------+---------------+---------------+-------------------------+------------+-----------+-------------+
| CHF     | Whit Monday   | Ordinal Based | 1899-12-30 00:00:00.000 | 50         | 9191      | 9189        |
+---------+---------------+---------------+-------------------------+------------+-----------+-------------+

期望的输出:

CCY    HOLIDAY          DATE

CHF    Good Friday      2022-04-15 00:00:00.000
CHF    Easter Monday    2022-04-18 00:00:00.000
CHF    Easter           2022-04-17 00:00:00.000
CHF    Ascension        2022-05-26 00:00:00.000
CHF    Whit Monday      2022-06-06 00:00:00.000

第 1 行是每年输入数据库的给定事实。给定为 date_type: date
第 2 行和第 3 行基于第 1 行。每行都将 hol_day_no 的值添加到第 1 行的 hol_dt(日期)。这种关系在 calloc_id 和 base_hol_id 列中进行了描述
第 4 行和第 5 行基于第 3 行。

我不知道如何处理 SQL 中基于序数的日期类型的嵌套。 任何指针将不胜感激。

【问题讨论】:

  • 也许这是一个人为的例子,但是如果升天是复活节后 39 天,而复活节是耶稣受难日后 2 天,那么耶稣受难日之后不是升天 (39+2)d 吗?也就是说,为什么需要嵌套层次结构?

标签: sql-server


【解决方案1】:

看起来需要一个非常简单的递归 CTE。您只需要将子行的日期添加到父行的日期即可。

WITH cte AS (
    SELECT
      t.hol_ccy,
      t.holiday,
      t.hol_dt,
      t.calloc_id
    FROM YourTable t
    WHERE t.base_hol_id IS NULL
    
    UNION ALL
    
    SELECT
      t.hol_ccy,
      t.holiday,
      DATEADD(day, t.hol_day_no, cte.hol_dt),
      t.calloc_id
    FROM YourTable t
    JOIN cte ON cte.calloc_id = t.base_hol_id
)
SELECT
  t.hol_ccy,
  t.holiday,
  t.hol_dt
FROM cte t;

db<>fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    相关资源
    最近更新 更多