使用空值查找两个日期之间的SQL天数

时间:2017-04-01 02:00:50

标签: mysql sql

我有两列:warning: here-document at line <n> delimited by end-of-file (wanted 'EOF')@NgModule({ imports: [ //SharedModule //This is removed routing ], declarations: [LazyComponent] }) 。我需要找到rental_dateactual_retdate之间的天数。对于某些情况,actual_retdate可以为null,因此我想查找今天的日期和这些情况下的租赁日期之间的天数。

目前我有:

rental_date

这给了我答案:

Rental_date     actual_retdate  Daysbetween
2014-07-04  2014-07-11  7
2016-05-06  2016-05-08  2
2016-08-07  2016-09-07  100
2015-02-02  2015-02-10  8
2015-10-10  2015-10-15  5
2015-08-07  2015-08-17  10
2017-02-04  NULL            NULL
2016-07-08  2016-07-16  8
2017-03-02  NULL            NULL
2015-03-15  2015-04-15  100

3 个答案:

答案 0 :(得分:2)

听起来你可以用NOW()来合并actual_retdate。

看起来像是:

SELECT rental_date, 
    actual_retdate, 
    COALESCE(actual_retdate,NOW()) - rental_date as 'Daysbetween' 
FROM rental_agreement

COALESCE基本上返回列表中的第一个非空值。因此,如果actual_retdate为NULL,它将返回NOW()的值。

https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_coalesce

编辑:由于Spencer提到减法不是完全可靠的,以此来获得天数的差异,这里是使用他建议的TIMESTAMPDIFF的更新片段。

SELECT rental_date, 
    actual_retdate, 
    TIMESTAMPDIFF(DAY,COALESCE(actual_retdate,NOW()),rental_date) as 'Daysbetween' 
FROM rental_agreement

答案 1 :(得分:1)

当值为COALESCE时,使用NULL为案例提供其他值:

SELECT
    rental_date,
    actual_retdate
    COALESCE( actual_retdate, CURDATE() ) AS actual_retdate_or_today,
    COALESCE( actual_retdate, CURDATE() ) - rental_date AS days_between
FROM
    rental_agreement

CURDATE()返回当前日期。我假设actual_retdatedate列,而不是datetime列,因为结果可能是意外的。另外,请考虑使用DATEADD代替-运算符来执行日期算术运算。

我重复COALESCE( actual_retdate, CURDATE() )表达式的原因是因为在SQL中你不能在另一列中引用列表达式 - 你必须重新计算结果或将它包装在外部查询中。

答案 2 :(得分:1)

您正在寻找coalesce()

select rental_date, actual_retdate,
       coalesce(actual_retdate, curdate()) - rental_date as Daysbetween 
from rental_agreement