Teradata最近两次约会

时间:2014-08-11 13:55:34

标签: teradata

嗨,我对teradata相对较新。我有一个有2个日期的行。我需要在这些拖曳日期之间获得最小值并将其显示为第三次约会。日期为YYYYMMDD格式。这是所有的可能性

示例表

  
    COL1 - DATE1 - DATE2   
  • 123--20140802--20140619   
  • 124--20140802--0   
  • 124--0--20140802   
  • 125--0--0

我需要我的结果集

  
    COL1 - DATE1 - DATE2 - MIN_DATE   
  • 123--20140802--20140619--6 /二千零十四分之十九   
  • 124--20140802--0--8 / 2/2014(非零将为min_date)   
  • 124--0--20140802--8 / 2/2014(非零将为min_date)   
  • 125--0--0 - ?

这就是我能提出来的

select col1, date1, date2, 
case 
     when date1 <> 0 and date2 = 0 then  cast((date1 - 19000000) as date)
     when date1  = 0 and date2 <> 0 then  cast((date2 - 19000000) as date)
     when date1 = 0 and date2  = 0 then cast(null as date)
     when date1  > date2 
            then 
                cast((date2 - 19000000) as date) 
            else 
                 cast((date1 - 19000000) as date)
end as min_date

这确实给了我结果,但查询很慢。我想知道是否有更好更有效的方法,请告诉我。我还需要以另一种格式显示min_date,如下所示

  

COL1 - DATE1 - DATE2 - MIN_DATE - MIN_MONTH   

  • 123--20140802--20140619--6 / 19/2014 - 2014年6月   
  • 124--20140802--0--8 / 2/2014 - 2014年8月   
  • 124--0--20140802--8 / 2/2014 - 2014年8月   
  • 125--0--0 - 空 - 空

  • 对于min_month,我知道如果我知道要使用哪个日期,我可以使用它

    cast(cast((date2 or date2 - 19000000) as date format 'MMM') as Char(3))
    || ', ' || 
    cast(cast((date2 or date2 - 19000000) as date format 'YYYY') as Char(4))
    

    非常感谢任何帮助。 提前谢谢..

    1 个答案:

    答案 0 :(得分:1)

    CASE可以简化为

    CAST(CASE
            WHEN date1 = 0 AND date2 = 0 THEN NULL
            WHEN date1 > date2 THEN date1
            ELSE date2
         END - 19000000 AS DATE) AS min_date
    

    格式化日期:

    min_date (FORMAT 'mmm,byyyy') (CHAR(9))