Не удается УДАЛИТЬ или ОБНОВИТЬ строку в Google BigQuery из-за того, что временная метка для поля выходит за пределы диапазона стандартной временной метки SQL

#sql #google-bigquery

#sql #google-bigquery

Вопрос:

В Google BigQuery у меня есть поле временной метки, в котором указан 20195 год. Это, конечно, вызывает ошибки, поскольку оно находится за пределами стандартного диапазона временных меток SQL. Однако я не могу обновить эти записи или удалить эту запись как ошибку, даже используя SAFE_CAST. Например, я пытался:

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

Появляется сообщение «Не удается вернуть недопустимое значение временной метки 575129030400000000 микросекунд относительно эпохи Unix». Я знаю, как ВЫБРАТЬ и вернуть значение null вместо ошибки с помощью Safe-Cast, но не могу использовать это для обновления / удаления.

Вопрос в следующем: как я могу удалить или обновить это поле успешно без каких-либо ошибок?

Комментарии:

1. Пожалуйста, покажите запрос, в котором у вас возникла проблема.

Ответ №1:

Вместо этого вы можете использовать safe. префикс для возврата NULL :

 select safe.timestamp_micros(575129030400000000)
  

Комментарии:

1. Спасибо, Гордон, я могу использовать safe. читать, но обновлять или удалять строку сложно,

Ответ №2:

Вы можете преобразовать в микросекунды (что не приводит к проверке границ), а затем попытаться преобразовать обратно, удалив строку, если безопасное преобразование приведет к НУЛЮ:

 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
  

Комментарии:

1. Спасибо Elliott, но я получаю ту же ошибку: не удается вернуть недопустимое значение временной метки …

2. С обоими запросами? У вас есть более одного столбца временной метки?

3. Да, в обоих запросах есть еще несколько столбцов с отметками времени, но это не проблема, я проверил, и это всего лишь 1 столбец с неверной временной меткой

Ответ №3:

Если вы хотите исправить неверные значения с помощью 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 Это секретный соус, который неочевиден из ответа Эллиота. Если вы попытаетесь сделать WHERE id = 1234 или что-то еще, это продолжит выдавать ту же ошибку. SAFE.DATE это краткий способ проверки правильности дат, который вернет, NULL если они недействительны, однако ваше поле может иметь значение null, поэтому я добавил проверку null.