【问题标题】:Teradata min between two dates两个日期之间的 Teradata 最小值
【发布时间】:2014-08-12 01:09:58
【问题描述】:

您好,我对 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/19/2014
  • 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--null--null
  • 对于 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))
    

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

    【问题讨论】:

    • 如果你取出那个大的case语句,你的查询是如何执行的?
    • 没有case语句的速度非常快。

    标签: teradata


    【解决方案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)) 
    

    【讨论】:

    • 谢谢。我会试试这个。
    猜你喜欢
    • 1970-01-01
    • 2017-06-13
    • 2021-09-23
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多