我希望生成一个日期时间戳数组,每个时间戳之间的步长为1小时。
示例:
[2018-01-01 10:00:00, 2018-01-01 11:00:00, 2018-01-01 12:00:00]
GENERATE_DATE_ARRAY
函数可以实现我的需求,但不幸的是它只适用于天、周、月等日期粒度,而不支持更细的时间粒度。
有什么建议吗? 谢谢。
我希望生成一个日期时间戳数组,每个时间戳之间的步长为1小时。
示例:
[2018-01-01 10:00:00, 2018-01-01 11:00:00, 2018-01-01 12:00:00]
GENERATE_DATE_ARRAY
函数可以实现我的需求,但不幸的是它只适用于天、周、月等日期粒度,而不支持更细的时间粒度。
有什么建议吗? 谢谢。
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
像这样:
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。顺便说一下,我认为类似GENERATE_DATETIME_ARRAY
的功能请求会受到热烈欢迎。
GENERATE_ARRAY
和GENERATE_DATE_ARRAY
;) 供以后参考,这是功能请求,要求例如GENERATE_TIMESTAMP_ARRAY
。 - Elliott Brossard