从雪花表中检索年份时,我一直在面对这个问题。
我的表的值如下:
// Code 2
我需要将值设置为 2020-10-02 。当我使用year :20
day:10
month :02
时,我得到了预期的结果,但是用 00 填充的dob就像 0020-10-02 一样打印。
此外,当年份列中有 99 时,则在检索时应显示 1999
我创建了如下查询:
concat_ws
建议我是否还有功能。
答案 0 :(得分:0)
看看这个
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');
答案 1 :(得分:0)
如果您的某些用户年龄很小,而另一些用户年龄很大,则无法自动显示“正确的”年份,那么您如何确定该人出生于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;
答案 2 :(得分:0)
将to_date
中的日期格式更改为'YY-MM-DD'
应该会给您想要的DOB,如果您怀疑数据有问题,我建议使用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);