在Google BigQuery中使用给定范围内的所有日期填充表格

Max*_*Max 8 google-bigquery

有没有方便的方法来填充Google BigQuery中给定范围内所有日期的表格?我需要的是从2015-06-01到CURRENT_DATE()的所有日期,所以这样的事情:

+------------+
| date       |
+------------+
| 2015-06-01 |
| 2015-06-02 |
| 2015-06-03 |
| ...        |
| 2016-07-11 |
+------------+
Run Code Online (Sandbox Code Playgroud)

最理想的是,下一步是在两个日期之间获得所有周,即:

+---------+
| week    |
+---------+
| 2015-23 |
| 2015-24 |
| 2015-25 |
| ...     |
| 2016-28 |
+---------+
Run Code Online (Sandbox Code Playgroud)

我一直在摆弄我发现的以下答案,但我无法让它们起作用,主要是因为核心功能不受支持,我找不到合适的方法来替换它们.

使用2个日期参数之间的日期填充临时表的最简单方法

在日期范围之间生成日期

非常感激您的帮忙!

最好,最大

Tim*_*tin 24

Mikhail的答案非常适合BigQuery的遗留sql语法.如果您使用标准SQL语法,则此解决方案稍微容易一些.

BigQuery标准SQL语法实际上具有内置函数GENERATE_DATE_ARRAY,用于从日期范围创建数组.它需要一个开始日期,结束日期和INTERVAL.例如:

SELECT day
FROM UNNEST(
    GENERATE_DATE_ARRAY(DATE('2015-06-01'), CURRENT_DATE(), INTERVAL 1 DAY)
) AS day
Run Code Online (Sandbox Code Playgroud)

如果你想要你可以使用的周和年

SELECT EXTRACT(YEAR FROM day), EXTRACT(WEEK FROM day)
FROM UNNEST(
    GENERATE_DATE_ARRAY(DATE('2015-06-01'), CURRENT_DATE(), INTERVAL 1 WEEK)
) AS day
Run Code Online (Sandbox Code Playgroud)


Mik*_*ant 5

所有日期为2015年6月1日至CURRENT_DATE()

SELECT DATE(DATE_ADD(TIMESTAMP("2015-06-01"), pos - 1, "DAY")) AS DAY
FROM (
     SELECT ROW_NUMBER() OVER() AS pos, *
     FROM (FLATTEN((
     SELECT SPLIT(RPAD('', 1 + DATEDIFF(TIMESTAMP(CURRENT_DATE()), TIMESTAMP("2015-06-01")), '.'),'') AS h
     FROM (SELECT NULL)),h
)))
Run Code Online (Sandbox Code Playgroud)

两个日期之间的所有星期

SELECT YEAR(DAY) AS y, WEEK(DAY) AS w
FROM (
  SELECT DATE(DATE_ADD(TIMESTAMP("2015-06-01"), pos - 1, "DAY")) AS DAY
  FROM (
       SELECT ROW_NUMBER() OVER() AS pos, *
       FROM (FLATTEN((
       SELECT SPLIT(RPAD('', 1 + DATEDIFF(TIMESTAMP(CURRENT_DATE()), TIMESTAMP("2015-06-01")), '.'),'') AS h
       FROM (SELECT NULL)),h
  )))
)
GROUP BY y, w
Run Code Online (Sandbox Code Playgroud)