将字符串强制转换为出生日期(不在将来)

时间:2019-05-14 16:41:36

标签: sql postgresql amazon-redshift

我使用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

是否存在使日期不落在未来的最佳实践?

演员表中是否没有论据? (我到处都是,但是什么也没发现。)否则,我预想最好的方法是测试将来的转换日期,然后对这些不良者进行字符串外科手术,然后将它们重新设定为合理的日期。

基本上:

  • 如果不是将来的日期:很好。
  • 如果将来的日期:
    • 剥离所有日期成分
    • 在yy上拍一个19
    • 将所有东西重新粘在一起
    • 投篮了。

这是否尽善尽美? (令我感到惊讶的是,我发现没有人能找到解决这个问题的更好方法。)

2 个答案:

答案 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