【问题标题】:Cannot DELETE or UPDATE row in Google BigQuery due to a timestamp for a field being outside the range of Standard SQL timestamp由于字段的时间戳超出标准 SQL 时间戳的范围,无法在 Google BigQuery 中删除或更新行
【发布时间】:2019-03-02 16:43:36
【问题描述】:

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

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

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

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

【问题讨论】:

  • 请显示您遇到问题的查询。

标签: sql google-bigquery


【解决方案1】:

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

select safe.timestamp_micros(575129030400000000)

【讨论】:

  • 谢谢 Gordon,我可以使用保险箱了。阅读,但它正在更新或删除棘手的行,
【解决方案2】:

您可以转换为微秒(这不会导致边界检查),然后尝试转换回来,如果安全转换导致 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

【讨论】:

  • 感谢 Elliott,但我得到了同样的错误:无法返回无效的时间戳值 ...
  • 两个查询?您有多个时间戳列吗?
  • 是的,这两个查询都有,还有几个时间戳列,但它们不是问题,我检查过,只是这 1 列的时间戳错误
【解决方案3】:

如果您想使用UPDATE 修复错误值,您必须使用条件将其应用于整个表。 Elliot 的回答是正确的,但我不能评论或投票,所以我会稍微详细说明并回答这个问题:

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,但是您的字段可能为空,这就是我添加空检查的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-22
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 2014-10-03
    • 2020-05-10
    • 1970-01-01
    相关资源
    最近更新 更多