【问题标题】:DATEDIFF - Replace NULL with NOW()DATEDIFF - 用 NOW() 替换 NULL
【发布时间】:2015-12-30 08:07:54
【问题描述】:

我得到以下 SQL 查询

SELECT
    e.id,
    c.name,
    e.location,
    e.designation,
    e.time_period_from,
    e.time_period_to,
    DATEDIFF(e.time_period_to, time_period_from) AS tenure_in_days
FROM
    employment e
LEFT JOIN
    company c ON (c.id = e.company_id)
LIMIT
    0, 10

这是完美的工作,我有一个场景 time_period_to 可以有 NULL 值,在这种情况下,我想用当前日期替换它。

这是我尝试过的。

SELECT
    e.id,
    c.name,
    e.location,
    e.designation,
    e.time_period_from,
    e.time_period_to,
    DATEDIFF(IF(ISNULL(e.time_period_to), NOW(), e.time_period_from)) AS tenure_in_days
FROM
    employment e
LEFT JOIN
    company c ON (c.id = e.company_id)
LIMIT
    0, 10

这给了我以下错误

ERROR 1582 (42000): Incorrect parameter count in the call to native function 'DATEDIFF'

我哪里错了?

【问题讨论】:

  • DATEDIFF(e.time_period_to, time_period_to) -- 那将永远是0,因为你要从自身中减去时间。
  • 不,它返回给我 NULL
  • 如果列是NULL,它将返回NULL。但是当列被填充时,它会返回 0,因为你是从它本身减去列。
  • 您不应该从结束时间中减去开始时间以获得有效差异吗?
  • 喜欢DATEDIFF(time_period_to, time_period_from)?

标签: mysql date datediff


【解决方案1】:

改用COALESCE

SELECT
    e.id,
    c.name,
    e.location,
    e.designation,
    e.time_period_from,
    e.time_period_to,
    DATEDIFF(COALESCE(e.time_period_to, NOW()), e.time_period_from) AS tenure_in_days
FROM employment e
LEFT JOIN company c ON (c.id = e.company_id)
LIMIT 0, 10

我猜你想要DATEDIFF(e.time_period_to, e.time_period_from)

使用 LIMIT 而不显式使用 ORDER BY 可能会返回取决于执行计划的结果。

【讨论】:

  • 我想对面DATEDIFF(e.time_period_to, e.time_period_from)让我检查一下。
  • @IbrahimAzharArmar 易于修复,只需替换 _from_to 后缀即可。让我知道您的最终查询。
【解决方案2】:

你的括号放错地方了。不是将e.time_period_from 指定为DATEDIFF 的第二个参数,而是将它作为IF 的第三个参数。应该是:

DATEDIFF(IF(ISNULL(e.time_period_to), NOW(), e.time_period_to), e.time_period_from) AS tenure_in_days

你也可以使用IFNULL(是COALESCE的更简单的版本,名字更便于记忆):

DATEDIFF(IFNULL(e.time_period_to, NOW()), e.time_period_from) AS tenure_in_days

【讨论】:

  • 谢谢@Barmar,很有意义。
猜你喜欢
  • 1970-01-01
  • 2012-12-24
  • 2012-12-23
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 1970-01-01
  • 2020-09-28
  • 2017-11-14
相关资源
最近更新 更多