BigQuery标准SQL:传递INTERVAL或date_part作为SQL UDF参数?

时间:2019-02-23 20:48:14

标签: google-bigquery

我正在尝试构建一个简单的TIMESTAMP_AGO SQL UDF。该函数是CURRENT_TIMESTAMPTIMESTAMP_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吗?
  • 如果失败,是否可以使用外部UDF(JS)?

1 个答案:

答案 0 :(得分:2)

以下是用于BigQuery标准SQL

TIMESTAMP_SUB支持date_part的以下值:

  • MICROSECOND
  • 未成年人
  • 第二
  • MINUTE
  • 小时

因此,您只需要检查通过的_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中。