Google bigquery BigQuery自定义项数组<;时间戳>;返回。无法将输出值强制为类型TIMESTAMP

Google bigquery BigQuery自定义项数组<;时间戳>;返回。无法将输出值强制为类型TIMESTAMP,google-bigquery,Google Bigquery,我使用BigQueryJavaScriptUDF返回一个日期数组。该数组必须是一个时间戳数组,类似于GENERATE_timestamp_array()函数,以便在需要时匹配非最新情况 当我从JavaScript UDF返回时间戳数组时,就会出现问题。如果我指定returns数组,数组返回的结果很好,但是当我使用returns数组时,BigQuery似乎无法强制日期的字符串格式 我尝试过多种字符串格式,即“YYYY-MM-DD HH:MM:ss”、“YYYY-MM-DD 00:00:00+00”

我使用BigQueryJavaScriptUDF返回一个日期数组。该数组必须是一个时间戳数组,类似于GENERATE_timestamp_array()函数,以便在需要时匹配非最新情况

当我从JavaScript UDF返回时间戳数组时,就会出现问题。如果我指定returns数组,数组返回的结果很好,但是当我使用returns数组时,BigQuery似乎无法强制日期的字符串格式

我尝试过多种字符串格式,即“YYYY-MM-DD HH:MM:ss”、“YYYY-MM-DD 00:00:00+00”、“YYYY-MM-DD HH:MM:ss.SSSS UTC”

CREATE TEMP FUNCTION
  getCalendarDateArray(date_start STRING,
    date_end STRING,
    frequency STRING,
    unit STRING,
    value INT64,
    parent STRING,
    next_date TIMESTAMP)

  RETURNS ARRAY<TIMESTAMP>

  LANGUAGE js AS

"""

    let dates_array = getTimestampArray(date_start, date_end, frequency, unit, value, parent, next_date);
    return dates_array;


"""
OPTIONS
  ( library=["gs://my-bucket/myfunction.js"] );
使用
Date()

CREATE TEMP函数
getCalendarDateArray()
返回数组
语言JSAS
"""
返回[日期('2018-03-03 10:10:10')]
""";
选择getCalendarDateArray()日期

下面的例子可能会说明发生了什么,只是为了扩展Felipe Hoffa接受的答案:

CREATE TEMP FUNCTION getDate_fail() RETURNS TIMESTAMP 
LANGUAGE js AS """ return Date.now()""";

CREATE TEMP FUNCTION getDate_succeed() RETURNS TIMESTAMP 
LANGUAGE js AS """ return Date(Date.now())""";


前一个函数抛出强制异常,而后一个函数成功

我不敢相信我没有试过这个。使用moment.js和think字符串返回是必需的。谢谢你,菲利佩。希望你一切顺利,我们很久以前见过面。我花了一段时间才弄明白。我将一个
时间戳
传递到UDF中,然后使用对象内省来确定其类型。谢谢你的提问!至少我们现在已经记录了这个错误的解决方案:)。如果答案正确,请接受!使用昂贵的JS UDF而不是使用内置的
GENERATE\u…\u ARRAY()。例如:从X日期开始,每周第2天,或每月第3周。然而,在使用UDF进行实验之后,很明显,它既昂贵又耗时。相反,我将在上传到bigquery之前简单地计算每行的日期。
CREATE TEMP FUNCTION
  getCalendarDateArray()
  RETURNS ARRAY<TIMESTAMP>
  LANGUAGE js AS
"""
  return [Date('2018-03-03 10:10:10')]
""";

SELECT getCalendarDateArray() dates
CREATE TEMP FUNCTION getDate_fail() RETURNS TIMESTAMP 
LANGUAGE js AS """ return Date.now()""";

CREATE TEMP FUNCTION getDate_succeed() RETURNS TIMESTAMP 
LANGUAGE js AS """ return Date(Date.now())""";