【发布时间】: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 小时为增量步长的日期时间时间戳数组
例子:
[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
您可以将GENERATE_ARRAY 函数与ARRAY 和TIMESTAMP_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
【讨论】:
GENERATE_ARRAY 和 GENERATE_DATE_ARRAY ;) 供将来参考,this is the feature request 具有例如GENERATE_TIMESTAMP_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
很明显,我不是 JavaScript 枪!在 JS 中实现这个可能有更好/更好的方法。但是,希望你能明白这一点。
我发现在我的旅行中确实找到了this。作为旁注,我认为feature request 或类似GENERATE_DATETIME_ARRAY 或类似的东西会很受欢迎。
【讨论】: