由于字段的时间戳超出标准SQL时间戳的范围,因此无法在Google BigQuery中进行DELETE或UPDATE行

时间:2019-03-02 16:43:37

标签: sql google-bigquery

在Google BigQuery中,我有一个时间戳字段,该字段的年份为20195。这当然会导致错误,因为它不在Standard SQL Timestamp范围内。但是,即使使用SAFE_CAST,也无法更新此记录或将其删除为错误。例如,我尝试过:

UPDATE [table] SET DateField = SAFE_CAST('2019-01-01 00:00:00 UTC' AS TIMESTAMP)...

“相对于Unix时代,无法返回无效的时间戳值575129030400000000微秒。”弹出。我知道如何使用Safe-Cast进行选择并返回null而不是错误,但是无法使用它来更新/删除。

问题是:如何成功删除或更新此字段而不会出现任何错误?

3 个答案:

答案 0 :(得分:0)

您可以使用safe.前缀来返回NULL

select safe.timestamp_micros(575129030400000000)

答案 1 :(得分:0)

您可以转换为微秒(这不会导致边界检查),然后尝试转换回来,如果安全转换结果为NULL,则删除该行:

DELETE dataset.table
WHERE ts IS NOT NULL
  AND SAFE.TIMESTAMP_MICROS(UNIX_MICROS(ts)) IS NULL

或者如果您想将这些值设置为NULL,则:

UPDATE dataset.table
SET ts = SAFE.TIMESTAMP_MICROS(UNIX_MICROS(ts))
WHERE true

答案 2 :(得分:0)

如果要使用UPDATE修复错误的值,则必须使用条件语句将其应用于整个表。艾略特的答案是正确的,但我无法发表评论或投票,因此我将略作阐述并回答以下问题:

UPDATE `my.table` 
SET DateField = IF(SAFE.DATE(DateField) IS NULL AND DateField IS NOT NULL, TIMESTAMP('2019-01-01 00:00:00 UTC'), DateField)
WHERE true

WHERE true是秘密调味料,从Elliot的答案中看不出来。如果您尝试执行WHERE id = 1234或其他任何操作,它将继续产生相同的错误。 SAFE.DATE是检查有效日期的一种简便方法,如果无效,将返回NULL,但是您的字段可能为空,这就是为什么我添加了空检查的原因。