在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而不是错误,但是无法使用它来更新/删除。
问题是:如何成功删除或更新此字段而不会出现任何错误?
答案 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
,但是您的字段可能为空,这就是为什么我添加了空检查的原因。