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

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

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

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

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

Ответы [ 3 ]

0 голосов
/ 02 марта 2019

Вы можете преобразовать в микросекунды (что не приводит к проверке границ), а затем попытаться преобразовать обратно, удалив строку, если безопасное преобразование приведет к 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
0 голосов
/ 20 июля 2019

Если вы хотите восстановить неверные значения, используя 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, если они недействительны, однако ваше поле может быть пустым, поэтому я добавил пустую проверку.

0 голосов
/ 02 марта 2019

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

select safe.timestamp_micros(575129030400000000)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...