我正在尝试构建一个简单的TIMESTAMP_AGO
SQL UDF。该函数是CURRENT_TIMESTAMP
和TIMESTAMP_SUB
的简单包装。
我想用签名来称呼它
SELECT TIMESTAMP_AGO(24, 'HOUR');
,甚至:
SELECT TIMESTAMP_AGO(24 HOUR);
但是BigQuery似乎不喜欢date_part
的{{1}}作为变量,因此失败了。我尝试过分离参数:
INTERVAL
,并且还尝试传递一个INTERVAL:
CREATE TEMP FUNCTION TIMESTAMP_AGO(_interval INT64, _date_part STRING) AS ((
SELECT TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL _interval _date_part)
));
CREATE TEMP FUNCTION TIMESTAMP_AGO(_interval INTERVAL) AS ((
SELECT TIMESTAMP_SUB(CURRENT_TIMESTAMP(), _interval)
));
可以这样传递吗? INTERVAL
吗? 答案 0 :(得分:2)
以下是用于BigQuery标准SQL
TIMESTAMP_SUB
支持date_part的以下值:
因此,您只需要检查通过的_date_part
并使用相应的“版本”即可,如下面的示例
#standardSQL
CREATE TEMP FUNCTION TIMESTAMP_AGO(_interval INT64, _date_part STRING) AS (
CASE _date_part
WHEN 'MICROSECOND' THEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL _interval MICROSECOND)
WHEN 'MILLISECOND' THEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL _interval MILLISECOND)
WHEN 'SECOND' THEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL _interval SECOND)
WHEN 'MINUTE' THEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL _interval MINUTE)
WHEN 'HOUR' THEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL _interval HOUR)
END
);
所以,现在下面的方法可以了
SELECT TIMESTAMP_AGO(24, 'HOUR')
如果您希望输入不区分大小写的内容,显然可以将UPPER()
添加到CASE _date_part
中。