Ошибка BigQuery: невозможно вернуть недопустимое значение метки времени в 6328502092800000000 микросекунд относительно эпохи Unix

Мы используем простой запрос выбора со стандартным SQL в BigQuery.

select expiration_date FROM cards

Но, он возвращает ошибку ниже,

Ошибка: невозможно вернуть недопустимое значение метки времени 6328502092800000000 микросекунд относительно эпохи Unix. Диапазон допустимых значений меток времени: [0001-01-1 00:00:00, 9999-12-31 23:59:59.999999];

Может ли кто-нибудь помочь мне за то же самое?

1 ответ

Проблема, с которой вы сталкиваетесь, заключается в том, что для стандартного SQL и устаревшего SQL используются разные определения TIMESTAMP тип данных. На самом деле, стандартный SQL имеет более строгий диапазон TIMESTAMP ценности, будучи 253402300799999999 максимальное значение и -62135596800000000 минимум (учтите, что ваша ценность, 6328502092800000000 выше максимально допустимого).

Для справки, здесь у вас есть TIMESTAMP определения для обоих языков SQL:

Руководство по переходу с Legacy SQL на Standrad SQL предлагает хорошее руководство по исправлению ошибок. invalid timestamp value ошибки, с которыми вы сталкиваетесь. Предлагаются два основных подхода, приведенных ниже, но, пожалуйста, посетите документацию, чтобы получить подробную информацию о каждом из них:

  1. Используйте UDF для фильтрации недействительных временных меток.
  2. использование SAFE_CAST со столбцом метки времени для возврата NULL значения вместо ошибки.

Это означает TIMESTAMP в таблице BigQuery имеет числовое значение 6328502092800000000.

Это числовое значение предназначено для представления количества микросекунд с начала эпохи Unix (1 января 1970 г., 00:00). Если вы сделаете расчет, это будет дата более чем 200 000 лет в будущем; сообщение об ошибке сообщает вам, что даты, начиная с 10 000 года нашей эры, не считаются действительными.

Глядя на ваше значение, мне кажется вероятным, что что-то пошло не так, и вы на самом деле представляете наносекунды с начала некоторой эпохи - неизмененное значение не должно быть загружено в BigQuery какTIMESTAMP. Это может быть ошибка клиентской библиотеки, которую вы используете для загрузки данных в BigQuery, или кода, который передает ей данные.

Если мы просто предположим, что ваше значение равно "наносекундам с начала эпохи Unix", мы получим временную метку 17 июля 2170 года - возможно, то, что вы хотели, если вы ожидали, что даты в будущем будут сохранены. В качестве альтернативы может оказаться, что у нас неправильная эпоха (другими словами, возможно, вы отсчитываете наносекунды с другой начальной точки?). В этом случае вам нужно будет определить правильную эпоху (это зависит от того, откуда пришли данные!).

Другие вопросы по тегам