В snowflake как получить дату в желаемом формате в snowflake

#stored-procedures #snowflake-cloud-data-platform #date-format #leading-zero

#хранимые процедуры #snowflake-cloud-data-platform #дата-формат #ведущее значение-ноль

Вопрос:

Я столкнулся с проблемой при извлечении года из таблицы snowflake.

Моя таблица имеет значение, указанное ниже:

 year :20
day:10
month :02
  

Мне нужно указать значение как 2020-10-02. Когда я использую concat_ws , я получаю ожидаемый результат, однако дополненный 00, dob печатается как 0020-10-02.

Также, когда у нас есть 99 в столбце «год», при извлечении он должен отображать 1999

Я создал запрос, как показано ниже:

 select to_date('concat_ws('-',json:year::varchar,json:month::varchar,json:date::varchar)', 'MM/DD/YYYY') from XXX;
  

Предложите мне, есть ли какие-либо функции.

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

1. Привет @Kannan, добро пожаловать в SO. Лучший способ сказать спасибо — это принять лучшие ответы и проголосовать за них. Чрезмерное спасибо после каждого абзаца добавляет шума в реальный вопрос. Пожалуйста, взгляните на эту вики-страницу сообщества

Ответ №1:

Взгляните на это

 YY

Two-digit year, controlled by the TWO_DIGIT_CENTURY_START session parameter, e.g. when set to 1980, values of 79 and 80 parsed as 2079 and 1980 respectively.

select TO_DATE('99-10-02','YY-MM-DD');
  

Ответ №2:

Невозможно автоматически отобразить «правильный» год раньше, если некоторые из ваших пользователей будут очень молодыми, а другие — очень старыми, как вы можете точно знать, родился ли человек в 20 или 21 веке?

Я не совсем понял, как хранятся ваши данные, поэтому я предполагаю структуру json, поскольку она отображается в вашем запросе.

 set json = '{
    "elements": [{
        "year": "01",
        "month": "02",
        "day": "10"
    }, {
        "year": "99",
        "month": "02",
        "day": "10"
    }, {
        "year": "20",
        "month": "02",
        "day": "10"
    }]
}'::varchar;
  

Теперь я проанализирую json, извлеку значения, поместив их здесь, чтобы вы могли убедиться, что у нас одинаковая структура данных.

 CREATE OR REPLACE TEMP TABLE test AS
select t2.VALUE: day::varchar   dob_day,
       t2.VALUE: month::varchar dob_month,
       t2.VALUE: year::varchar  dob_year
from (select parse_json($json) as json) t,
     lateral flatten(input => parse_json(t.json), path => 'elements') t2
  

Теперь та часть, которая вас заинтересует. Это грязный трюк и предполагает, что если двузначный год выше текущего двузначного года, то это не может быть 2000, а вместо этого 1900.

 SELECT to_date(concat_ws('-',
                         IFF(t2.dob_year > RIGHT(extract(year, current_timestamp), 2), '19'||t2.dob_year , '20'||t2.dob_year ),
                         t2.dob_month,
                         t2.dob_day)) proper_date
FROM test t2;
  

Ответ №3:

Измените формат даты в вашем to_date на 'YY-MM-DD' , который должен дать вам желаемый результат, и я предлагаю использовать, try_to_date если вы подозреваете проблемы с данными, так как это будет NULL поле, если не указана действительная дата.

ПРИМЕЧАНИЕ, если вы используете форматирование США, тогда используйте YY-DD-MM (месяц в конце)

 select to_date('concat_ws('-',json:year::varchar,json:month::varchar,json:date::varchar)', 'YY-MM-DD') from XXX;
  

Кроме того, если вы хотите безопасно проверить, что DOB не в будущем, добавьте IFF следующим образом

 IFF(CURRENT_DATE > to_date('concat_ws('-',json:year::varchar,json:month::varchar,json:date::varchar)', 'YY-MM-DD'), to_date('concat_ws('-',json:year::varchar,json:month::varchar,json:date::varchar)', 'YY-MM-DD'),NULL);