【问题标题】:MySQL multiple if statements for datesMySQL 多个日期的 if 语句
【发布时间】:2013-10-11 20:33:31
【问题描述】:

我正在尝试获取两列之间的日期差异,然后最终获取按承包商字段分组的平均天数。我能够获取大部分 SQL,但我似乎无法弄清楚如何获取多个 if 场景的日期差异。

基本上,如果原始日期列为空而新日期列不为空,则获取新日期与订购日期之间的日期差。反之亦然。如果原始日期和新日期都为空,只需将日期差异设置为空。它应该如下所示,不考虑分组的平均天数。

下面的 SQL(还没有包含 avg 函数):

SELECT PT1.CONTRACTOR AS 'Contractor', PT1.date_order AS "date ordered", PT1.DATE_COMPLETED AS "original date", PT2.DATE_COMPLETED AS "new date",
  IF(PT1.DATE_COMPLETED = NULL AND PT2.DATE_COMPLETED IS NOT NULL, DATEDIFF(PT2.DATE_COMPLETED, PT1.DATE_ORDER), IF(PT2.DATE_COMPLETED = NULL AND PT1.DATE_COMPLETED IS NOT NULL, DATEDIFF(PT1.DATE_COMPLETED, PT1.DATE_ORDER), NULL)) AS "DATE DIFF"
FROM PTABLE1 PT1
  INNER JOIN PTABLE2 PT2
    ON PT1.ID = PT2.ID
WHERE PT2.STATUS = 'To_do' OR PT2.STATUS = 'Completed'
  AND PT2.COMPLETE = 'Yes'
 -- GROUP BY PT1.CONTRACTOR

【问题讨论】:

  • 您是否考虑过使用CASE 来提高透明度?
  • 如果您允许日期差异为 0 而不是 null,那么也许您可以使用 COALESCE
  • @CORRUPT 为什么你说NULL = NULL 将评估为FALSE?它将评估为NULL
  • @MostyMostacho 是的,对不起。谢谢。但是我无法修复它。将重新发布它。
  • 另外,请注意在 MySQL NULL IS NULL 中。 NULL = NULL 将始终评估为 NULL

标签: mysql if-statement multipleselection


【解决方案1】:

COALESCE 是你的朋友——它返回列表中的第一个非空值,如果它们都是 NULL,则返回 NULL。

所以你想要的可能是

datediff(coalesce(original_date, new_date), order_date)

如果两者都是 null,datediff 将返回 null。

【讨论】:

  • 是的,我不确定当一个表达式为 null 时 datediff 是否会返回 null。
  • @grape_mao,是的 - 你可以通过在 mysql shell "select datediff(now(), NULL)" 中尝试这个来检查,你会得到一个 NULL。
  • @DMAc 是的,这是完美的。简单多了。谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-03-27
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多