我想生成一个日期时间戳数组,递增步长为1小时
示例:
[2018-01-01 10:00:00, 2018-01-01 11:00:00, 2018-01-01 12:00:00]
数组函数GENERATE_DATE_ARRAY
执行我想要的操作,但不幸的是它似乎只适用于日/周/月,而不是日内时间粒度
有什么建议吗? 感谢
答案 0 :(得分:2)
您可以将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
答案 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
显然,我不是JavaScript枪!在JS中实现这个可能有更好/更好的方法。但是,希望你能得到这个想法。
我发现我的旅行确实找到了this。作为旁注,我认为对GENERATE_DATETIME_ARRAY
或类似内容的feature request会很受欢迎。