【问题标题】:Generating a datetime range生成日期时间范围
【发布时间】:2018-06-17 06:07:54
【问题描述】:

我想生成一个以 1 小时为增量步长的日期时间时间戳数组

例子:

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

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

有什么建议吗? 谢谢

【问题讨论】:

    标签: arrays datetime google-bigquery


    【解决方案1】:

    您可以将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
    

    【讨论】:

    • 你看。艾略特比我聪明多了。不过我还是更喜欢我的 UDF ;-)
    • @GrahamPolley 我有一个优势,因为我指定并实现了 GENERATE_ARRAYGENERATE_DATE_ARRAY ;) 供将来参考,this is the feature request 具有例如GENERATE_TIMESTAMP_ARRAY.
    • 我无法与之竞争 ;-)
    【解决方案2】:

    我确信比我聪明得多的人会找到一种方法来做到这一点,那就是 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
    

    很明显,我不是 JavaScript 枪!在 JS 中实现这个可能有更好/更好的方法。但是,希望你能明白这一点。

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

    【讨论】:

    • 谢谢,但遗憾的是我们无法使用 UDF,因为它们有更严格的速率限制配额。感谢您的链接,我会尝试看看我是否可以使用它
    猜你喜欢
    • 2011-12-11
    • 2012-02-21
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    相关资源
    最近更新 更多