【问题标题】:BigQuery Standard SQL: pass INTERVAL, or date_part as SQL UDF argument?BigQuery 标准 SQL:将 INTERVAL 或 date_part 作为 SQL UDF 参数传递?
【发布时间】:2019-02-24 05:22:32
【问题描述】:

我正在尝试构建一个简单的TIMESTAMP_AGO SQL UDF。该函数是CURRENT_TIMESTAMPTIMESTAMP_SUB 的简单包装器。

我想叫它,带签名:

SELECT TIMESTAMP_AGO(24, 'HOUR');

或者,甚至:

SELECT TIMESTAMP_AGO(24 HOUR);

但是 BigQuery 似乎不喜欢 INTERVALdate_part 作为变量,所以它失败了。我试过分离论点:

CREATE TEMP FUNCTION TIMESTAMP_AGO(_interval INT64, _date_part STRING) AS ((

  SELECT TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL _interval _date_part)

));

并且,尝试传递一个 INTERVAL :

CREATE TEMP FUNCTION TIMESTAMP_AGO(_interval INTERVAL) AS ((

  SELECT TIMESTAMP_SUB(CURRENT_TIMESTAMP(), _interval)

));
  • INTERVAL 可以这样传递吗?
  • 或者,是否可以传递动态date_part
  • 如果没有这些,是否可以使用外部 UDF (JS)?

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    以下是 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

    【讨论】:

      猜你喜欢
      • 2010-12-09
      • 2017-08-12
      • 1970-01-01
      • 2015-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多