#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.