#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);