【发布时间】: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