Преобразование ‘даты’, хранящейся как целое число (количество дней с 1 января 1970 года) в Avro, в тип ‘даты’ Snowflake

#snowflake-cloud-data-platform

#snowflake-cloud-data-platform

Вопрос:

У меня есть требование перенести данные из некоторых локальных баз данных в облако. Некоторые данные в таблицах хранятся как «дата» в формате гггг-мм-дд.

Мы преобразуем данные, хранящиеся в таблицах, в формат Avro, а затем они копируются в Snowflake.

В Avro дата хранится как целочисленный тип даты Avro

Когда я пытаюсь вставить данные в snowflake, он не может преобразовать это целое число обратно в дату. Я получаю следующую ошибку: «Не удалось ввести ВАРИАНТ 13707 на сегодняшний день»

где 13707 — количество дней с 1 января 1970 года

Спасибо!

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

1. Хранится ли дата внутри столбца VARIANT? Какой тип столбца определен в Snowflake и как выполняется преобразование? У вас есть пример?

2. @Sergui Я пытаюсь вставить в качестве запроса: вставить в «dbname». «schemaname». «tablename» (start_date) значения (to_date (13707)); Начальная дата имеет тип «дата»

Ответ №1:

Вам необходимо вычислить значение даты на основе значения варианта. Для этой цели вы можете использовать DATEADD:

https://docs.snowflake.com/en/sql-reference/functions/dateadd.html

 create table avro_test ( x date );

insert into avro_test(x) 
select  dateadd('day',parse_json('13707'),'1970-01-01');

select * from avro_test;

 ------------ 
|     X      |
 ------------ 
| 2007-07-13 |
 ------------ 
 

Ответ №2:

Если формат входного параметра представляет собой строку, содержащую целое число:

После преобразования строки в целое число целое число обрабатывается как количество секунд, миллисекунд, микросекунд или наносекунд после начала эпохи Unix (1970-01-01 00:00:00.000000000 UTC).

Если целое число меньше 31536000000 (количество миллисекунд в году), то значение обрабатывается как количество секунд.

Если значение больше или равно 31536000000 и меньше 31536000000000, то значение обрабатывается как миллисекунды.

Если значение больше или равно 31536000000000 и меньше 31536000000000000, то значение обрабатывается как микросекунды.

Если значение больше или равно 31536000000000000, то значение обрабатывается как наносекунды.

Если вычисляется более одной строки (например, если вводом является имя столбца таблицы, содержащей более двух строк), первое обработанное значение определяет, будут ли все последующие значения обрабатываться как секунды, миллисекунды, микросекунды или наносекунды.

Если первое значение больше или равно 31536000000, то все значения будут обрабатываться как миллисекунды, даже если некоторые оставшиеся значения меньше 31536000000. Аналогичная логика применяется для микросекунд и наносекунд.

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

1. Если вы вставляете как временную метку unix, вышеуказанная логика будет работать. Но если я пытаюсь вставить как количество дней с начала эпохи, это не так.