选择最早的两个可以为空的日期时间

时间:2014-03-19 12:49:52

标签: mysql sql datetime

在一个包含两个可为空的日期/日期时间列的表中,您如何有效地选择两个日期中最早的非空?

具体而言,这是我感兴趣的:

|   Date1    |   Date2    |    |  Expected  |
|------------|------------|    |------------|
| 2014-02-23 | 2014-01-16 |    | 2014-01-16 |
| 2014-02-01 |    NULL    |    | 2014-02-01 |
|    NULL    | 2014-01-13 |    | 2014-01-13 |
|    NULL    |    NULL    |    |    NULL    |

我可以设法使用以下任一查询获取这些结果。我的解决方案都使用LEAST运算符,当任一参数为NULL时(而不是两者都为NULL时)返回NULL,因此需要更多逻辑才能完成工作。

SELECT IF(ISNULL(Date1), Date2, IFNULL(LEAST(Date1, Date2), Date1)) AS EarlyDate FROM MyTable

或同等的:

SELECT IFNULL(IFNULL(LEAST(Date1, Date2), Date1), Date2) AS EarlyDate FROM MyTable

我的感觉是,在我上面的两个查询中都存在多余的内容。有谁能建议更好的解决方案?

3 个答案:

答案 0 :(得分:3)

你必须检查NULL,试试这个:

SELECT IF(Date1 IS NULL OR Date2 IS NULL, 
          COALESCE(DATE1, DATE2), 
          LEAST(DATE1, DATE2)
       ) AS EarlyDate 
FROM MyTable

工作小提琴:http://sqlfiddle.com/#!2/7940c/1

答案 1 :(得分:2)

你可以在COALESCE(date1,date2)和COALESCE(date2,date1)上使用LEAST:

SELECT LEAST( COALESCE(Date1,Date2) , COALESCE(Date2,Date1) ) AS EarlyDate
FROM MyTable;

答案 2 :(得分:1)

试试这个:

SELECT CASE WHEN DATE1 IS NULL OR DATE2 IS NULL THEN COALESCE(DATE1,DATE2) ELSE LEAST(Date1,Date2) END AS LEAST FROM TableName

结果:

DATE
2014-01-16
2014-02-01
2014-01-13
NULL

请参阅SQL Fiddle中的结果。

<强>解释

如果其中一个日期为NULL,则COALESCE()用于选择第一个非NULL值。如果两者都是NOT NULL,则LEAST()用于从两者中选择最短日期。

LEAST()返回一个或多个表达式列表中的最小值。阅读更多here

COALESCE()返回列表中的第一个非NULL值,如果没有非NULL值,则返回NULL。阅读更多here