开发者

SQL: earliest date from set of date fields

开发者 https://www.devze.com 2023-01-25 18:52 出处:网络
I have a series of dates associated with a unique identifier in a table. For example: 1 | 1999-04-01 | 0000-00-00 | 0000-00-00 | 0000-00-00| 2008-12-01 |

I have a series of dates associated with a unique identifier in a table. For example:

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 | 

Is there a way, to select the earliest date from the predefined list of DATE fields using a straightforward SQL command?

So the expected output would be:

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

I am guessing this is not possibl开发者_开发百科e but I wanted to ask and make sure. My current solution in mind involves putting all the dates in a temporary table and then using that to get the MIN()

thanks

Edit: The problem with using LEAST() as stated is that the new behaviour is to return NULL if any of the columns in NULL. In a series of dates like the dataset in question, any date might be NULL. I would like to obtain the earliest actual date from the set of dates.

SOLUTION: Used a combination of LEAST() and IF() in order to filter out NULL dates.

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

Lessons learnt a) COALESCE does not treat '0000-00-00' as a NULL date, b) LEAST will return '0000-00-00' as the smallest value - I would guess this is due to internal integer comparison(?)


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


Actually you can do it like bellow or using a large case structure... or with least(date1, date2, dateN) but with that null could be the minimum value...

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


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

精彩评论

暂无评论...
验证码 换一张
取 消