我使用CAST AS DATE CAST(birth_str AS DATE) AS birth_date
将mm / dd / yy字符串转换为redshift中的日期。转换可以正确处理组件,但是当年份低于1970时,会将年份转换为将来的时间。例如:
birth_str birth_date
07/19/84 1984-07-19
02/07/66 2066-02-07
06/24/84 1984-06-24
01/31/64 2064-01-31
12/08/62 2062-12-08
02/21/36 2036-02-21
02/19/37 2037-02-19
07/01/74 1974-07-01
08/25/50 2050-08-25
08/31/39 2039-08-31
是否存在使日期不落在未来的最佳实践?
演员表中是否没有论据? (我到处都是,但是什么也没发现。)否则,我预想最好的方法是测试将来的转换日期,然后对这些不良者进行字符串外科手术,然后将它们重新设定为合理的日期。
基本上:
这是否尽善尽美? (令我感到惊讶的是,我发现没有人能找到解决这个问题的更好方法。)
答案 0 :(得分:2)
有最佳实践吗?绝对!不要将日期存储为字符串。将日期存储为date
。这就是为什么SQL具有本机类型的原因。
在您的情况下,您可以使用条件逻辑:
select (case when cast(birth_str AS DATE) < current_date
then cast(birth_str AS DATE)
else cast(birth_str AS DATE) - interval '100 year'
end) as birth_date
或者自Redshift can't handle intervals起,您可以这样做:
SELECT (CASE
WHEN birth_str::DATE < CURRENT_DATE
THEN birth_str::DATE
ELSE ADD_MONTHS(birth_str::DATE, -1200)
END) AS birth_date
答案 1 :(得分:1)
您可以使用CASE来检查转换后的DATE是否大于TODAY。如果是,则从以下结果减去100年。
一个问题:是否有可能有14年2月21日这样的日期可以属于1900或2000?
SELECT
CASE
WHEN CAST('02/21/36' AS DATE) >GETDATE() THEN DATEADD(YY,-100,CAST('02/21/36' AS DATE))
ELSE CAST('02/21/36' AS DATE)
END