生成日期时间范围

时间:2018-01-08 09:22:16

标签: arrays datetime google-bigquery

我想生成一个日期时间戳数组,递增步长为1小时

示例:

[2018-01-01 10:00:00, 2018-01-01 11:00:00, 2018-01-01 12:00:00]

数组函数GENERATE_DATE_ARRAY执行我想要的操作,但不幸的是它似乎只适用于日/周/月,而不是日内时间粒度

有什么建议吗? 感谢

2 个答案:

答案 0 :(得分:2)

您可以将GENERATE_ARRAY函数与ARRAYTIMESTAMP_ADD函数一起使用,以构建具有所需范围的数组。这是一个例子:

SELECT
  ARRAY(
    SELECT TIMESTAMP_ADD('2018-01-01 10:00:00', INTERVAL x HOUR)
    FROM UNNEST(GENERATE_ARRAY(0, TIMESTAMP_DIFF('2018-01-01 12:00:00', '2018-01-01 10:00:00', HOUR))) AS x
  ) AS timestamps

如果您愿意,可以创建一个SQL UDF,然后再调用它:

CREATE TEMP FUNCTION MakeRange(lower TIMESTAMP, upper TIMESTAMP) AS (
  ARRAY(
    SELECT TIMESTAMP_ADD(lower, INTERVAL x HOUR)
    FROM UNNEST(GENERATE_ARRAY(0, TIMESTAMP_DIFF(upper, lower, HOUR))) AS x
  )
);
SELECT MakeRange('2018-01-01 10:00:00', '2018-01-01 12:00:00') AS timestamps

答案 1 :(得分:1)

我确信比我更聪明的人会找到一种方法来做到这一点是SQL(眯着眼睛看Mikhail ),但是如何使用JavaScript UDF。

这样的事情:

CREATE TEMPORARY FUNCTION
  generate_stepped_timestamp_array(step FLOAT64,
    iterations FLOAT64)
  RETURNS ARRAY<TIMESTAMP>
  LANGUAGE js AS """
  var timestamps = [];
  var start = new Date('2018-01-01');
  for(i = 0; i < iterations; i++){
    start.setHours(start.getHours() + step);
    timestamps.push(new Date(start));
  }
  return timestamps;
  """;
SELECT
  generate_stepped_timestamp_array(1,
    24) AS stepped_array

enter image description here

显然,我不是JavaScript枪!在JS中实现这个可能有更好/更好的方法。但是,希望你能得到这个想法。

我发现我的旅行确实找到了this。作为旁注,我认为对GENERATE_DATETIME_ARRAY或类似内容的feature request会很受欢迎。