我想生成一个 DimDate 表,包括从 2023-01-01 到 2024-12-31(也许未来更多年)。 range_start 应始终从一年的第一天开始,例如 2023-01-01。间隔为一周。不要考虑周名。一年的最后一周应包括一年中的剩余时间,如示例中所示。
样品:
完整日期 | 范围_开始 | 范围结束 |
---|---|---|
2023-01-01 | 2023-01-01 | 2023-01-07 |
2023-01-02 | 2023-01-01 | 2023-01-07 |
2023-01-03 | 2023-01-01 | 2023-01-07 |
2023-01-04 | 2023-01-01 | 2023-01-07 |
2023-01-05 | 2023-01-01 | 2023-01-07 |
2023-01-06 | 2023-01-01 | 2023-01-07 |
2023-01-07 | 2023-01-01 | 2023-01-07 |
2023-01-08 | 2023-01-08 | 2023-01-14 |
2023-01-09 | 2023-01-08 | 2023-01-14 |
2023-01-10 | 2023-01-08 | 2023-01-14 |
2023-01-11 | 2023-01-08 | 2023-01-14 |
2023-01-12 | 2023-01-08 | 2023-01-14 |
2023-01-13 | 2023-01-08 | 2023-01-14 |
2023-01-14 | 2023-01-08 | 2023-01-14 |
巴拉巴拉.. | ||
2023-12-17 | 2023-12-17 | 2023-12-23 |
2023-12-18 | 2023-12-17 | 2023-12-23 |
2023-12-19 | 2023-12-17 | 2023-12-23 |
2023-12-20 | 2023-12-17 | 2023-12-23 |
2023-12-21 | 2023-12-17 | 2023-12-23 |
2023-12-22 | 2023-12-17 | 2023-12-23 |
2023-12-23 | 2023-12-17 | 2023-12-23 |
2023-12-24 | 2023-12-24 | 2023-12-31 |
2023-12-25 | 2023-12-24 | 2023-12-31 |
2023-12-26 | 2023-12-24 | 2023-12-31 |
2023-12-27 | 2023-12-24 | 2023-12-31 |
2023-12-28 | 2023-12-24 | 2023-12-31 |
2023-12-29 | 2023-12-24 | 2023-12-31 |
2023-12-30 | 2023-12-24 | 2023-12-31 |
2023-12-31 | 2023-12-24 | 2023-12-31 |
2024-01-01 | 2024-01-01 | 2024-01-07 |
2024-01-02 | 2024-01-01 | 2024-01-07 |
2024-01-03 | 2024-01-01 | 2024-01-07 |
2024-01-04 | 2024-01-01 | 2024-01-07 |
2024-01-05 | 2024-01-01 | 2024-01-07 |
2024-01-06 | 2024-01-01 | 2024-01-07 |
2024-01-07 | 2024-01-01 | 2024-01-07 |
2024-01-08 | 2024-01-08 | 2024-01-14 |
2024-01-09 | 2024-01-08 | 2024-01-14 |
2024-01-10 | 2024-01-08 | 2024-01-14 |
2024-01-11 | 2024-01-08 | 2024-01-14 |
2024-01-12 | 2024-01-08 | 2024-01-14 |
2024-01-13 | 2024-01-08 | 2024-01-14 |
2024-01-14 | 2024-01-08 | 2024-01-14 |
巴拉巴拉.. |
问了ChatGPT很多次最终的版本是这样的:
WITH
dates AS (
SELECT
date AS fulldate
FROM
UNNEST(GENERATE_DATE_ARRAY('2023-01-01', '2024-12-31')) AS date )
SELECT
fulldate,
cast(DATE_ADD(fulldate, INTERVAL -(MOD(EXTRACT(DAYOFWEEK
FROM
fulldate) - 1, 7)) DAY) as date) AS range_start,
cast(DATE_ADD(fulldate, INTERVAL (7 - MOD(EXTRACT(DAYOFWEEK
FROM
fulldate) - 1, 7)) DAY) - INTERVAL 1 DAY as date) AS range_end
FROM
dates;
这从一开始就很好,但在 2023 年最后一周就很糟糕。而且 2024 年不会从 1 月 1 日重新开始。有没有一个完美的脚本来解决这个问题呢?不然只能用excel手动输入记录,很痛苦...
我的转储解决方案,如果没有人可以帮助或者可能没有完美的方法......
create or replace table `dim_date` as
WITH
dates AS (
SELECT
date AS fulldate
FROM
UNNEST(GENERATE_DATE_ARRAY('2023-01-01', '2023-12-31')) AS date )
SELECT
fulldate,
cast(DATE_ADD(fulldate, INTERVAL -(MOD(EXTRACT(DAYOFWEEK
FROM
fulldate) - 1, 7)) DAY) as date) AS range_start,
cast(DATE_ADD(fulldate, INTERVAL (7 - MOD(EXTRACT(DAYOFWEEK
FROM
fulldate) - 1, 7)) DAY) - INTERVAL 1 DAY as date) AS range_end
FROM
dates;
update `dim_date` set range_end = '2023-12-31' where range_start ='2023-12-24';
update `dim_date` set range_start = '2023-12-24' where fulldate ='2023-12-31';
update `dim_date` set range_end = '2023-12-31' where fulldate ='2023-12-31';