SQL:日期字段集中的最早日期

时间:2010-11-17 12:40:22

标签: sql mysql datetime date

我有一系列与表中唯一标识符相关联的日期。例如:

1 | 1999-04-01 | 0000-00-00 | 0000-00-00 | 0000-00-00   | 2008-12-01 | 
2 | 1999-04-06 | 2000-04-01 | 0000-00-00 | 0000-00-00   | 2010-04-03 | 
3 | 1999-01-09 | 0000-00-00 | 0000-00-00 | 0000-00-00   | 2007-09-03 | 
4 | 1999-01-01 | 0000-00-00 | 1997-01-01 | 0000-00-00   | 2002-01-04 | 

有没有办法,使用简单的SQL命令从预定义的DATE字段列表中选择最早的日期?

所以预期的输出是:

1 | 1999-04-01
2 | 1999-04-06
3 | 1998-01-09
4 | 1997-01-01

我猜这是不可能的,但我想问一下并确定。我当前的解决方案是将所有日期放在临时表中,然后使用它来获取MIN()

感谢

编辑:如上所述使用LEAST()的问题是,如果任何列为NULL,则新行为将返回NULL。在像所讨论的数据集这样的一系列日期中,任何日期都可能为NULL。我想从这组日期中获得最早的实际日期。

SOLUTION:使用LEAST()和IF()的组合来过滤掉NULL日期。

 SELECT LEAST( IF(date1=0,NOW(),date1), IF(date2=0,NOW(),date2), [...] );

经验教训a)COALESCE不将'0000-00-00'视为NULL日期,b)LEAST将'0000-00-00'作为最小值返回 - 我猜这是由于内部整数比较(?)

3 个答案:

答案 0 :(得分:3)

select id, least(date_col_a, date_col_b, date_col_c) from table

UPD

select id, least (
  case when date_col_a = '0000-00-00' then  now() + interval 100 year else date_col_a end,
  case when date_col_b = '0000-00-00' then  now() + interval 100 year else date_col_b end) from table

答案 1 :(得分:0)

实际上你可以像下面这样或者使用大型case结构......或者使用least(date1, date2, dateN)来实现它,但是使用null可能是最小值......

select rowid, min(date) 
  from
       ( select rowid, date1 from table
         union all 
         select rowid, date2 from table
         union all 
         select rowid, date3 from table
         /* and so on */
       )
group by rowid;

HTH

答案 2 :(得分:0)

select
  id,
  least(coalesce(date1, '9999-12-31'), ....)
from
  table