Arrays 生成日期时间范围

Arrays 生成日期时间范围,arrays,datetime,google-bigquery,Arrays,Datetime,Google Bigquery,我想生成一个datetime时间戳数组,递增步长为1小时 例如: [2018-01-01 10:00:00, 2018-01-01 11:00:00, 2018-01-01 12:00:00] 数组函数GENERATE\u DATE\u array实现了我想要的功能,但不幸的是,它似乎只适用于天/周/月,而不适用于日内时间粒度 有什么建议吗? 谢谢我相信比我聪明得多的人会找到一种方法来实现这一点,那就是SQL(对Mikhail视而不见),但是使用JavaScript UDF怎么样 大概是这样的

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

例如:

[2018-01-01 10:00:00, 2018-01-01 11:00:00, 2018-01-01 12:00:00]
数组函数
GENERATE\u DATE\u array
实现了我想要的功能,但不幸的是,它似乎只适用于天/周/月,而不适用于日内时间粒度

有什么建议吗?
谢谢

我相信比我聪明得多的人会找到一种方法来实现这一点,那就是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
创建临时函数
生成\u步进\u时间戳\u数组(步骤64,
迭代次数(64)
返回数组
语言js为“”
var时间戳=[];
风险值开始=新日期('2018-01-01');
对于(i=0;i

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


我在旅行中发现了。作为旁注,我认为类似于
GENERATE\u DATETIME\u ARRAY
或类似的函数会受到欢迎。

您可以使用
GENERATE\u ARRAY
函数和
ARRAY
TIMESTAMP\u 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,因为他们有更严格的利率限额。谢谢你的链接,我会试试看我是否能用上你看到的。艾略特比我聪明多了。不过我还是喜欢我的UDF;-)@GrahamPolley我有一个优势,因为我指定并实现了
GENERATE_ARRAY
GENERATE_DATE_ARRAY
)作为将来的参考,例如,
生成时间戳数组
。我无法与之竞争;-)