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



在一个有两个可空的date/datetime列的表中,如何有效地选择两个日期中最早的不是NULL的日期?

具体来说,这就是我感兴趣的:

|   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

我的感觉是我上面的两个查询都有多余的东西。有人能提出更好的解决方案吗?

你必须检查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

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

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

试试这个:

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()返回一个或多个表达式列表中最小的一个。点击这里阅读更多

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

相关内容

  • 没有找到相关文章