2013-10-04 147 views
1

我試圖獲取兩列之間的日期差異,然後最終得到由承包商字段分組的平均天數。我能夠獲得大部分的SQL,但我似乎無法弄清楚如何獲取多個場景的日期差異。MySQL多個if語句的日期

基本上,如果原始日期列爲空,並且新日期列不是,則獲取訂購的新日期和日期之間的日期差異。反之亦然。如果原始日期和新日期都爲空,只需將日期差異設置爲空。它應該如下所示,不考慮分組的平均天數。

enter image description here

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 
+0

您是否考慮過使用'CASE'來獲得透明度? – BlitZ

+0

如果你允許date diff爲0而不是null,那麼你可以使用COALESCE –

+0

@CORRUPT爲什麼你說'NULL = NULL'會評估爲'FALSE'?它會評估爲'NULL' –

回答

2

COALESCE是你的朋友 - 它在列表返回第一個非空值,或者NULL,如果他們是全部爲NULL。

所以,你想要什麼可能是

datediff(coalesce(original_date, new_date), order_date) 

如果都爲null,DATEDIFF將返回null。

+0

是的,我不確定當一個表達式爲空時,如果datediff會返回null。 –

+0

@grape_mao,是的 - 你可以通過在mysql shell中選擇「datediff(now(),NULL)」來檢查它,然後你將返回NULL。 –

+0

@DMAc是的,這是完美的。簡單得多。謝謝! – justWired