我練我的SQL技能,這裏就是我練上一個問題: https://www.hackerrank.com/challenges/projectsMySQL:爲什麼日期差異總是0?
這裏的問題:
給你一個表,項目,包含三列:TASK_ID, Start_Date和End_Date。保證 End_Date和Start_Date之間的差值等於 表中每行的1天。如果任務的結束日期是連續的,那麼它們是同一個項目的一部分 。薩曼莎有興趣找到完成的不同項目總數 。
編寫一個查詢以輸出 列出的項目的開始和結束日期,以按升序完成項目所需的天數。 如果有多個項目具有相同數量的 完成日期,則按項目的開始日期排序。
我的邏輯是,我會按開始日期排序,然後爲每一行分配排名。如果當前結束日期是從上一個結束日期開始連續的,又名datediff(end_date,@e)= 1,那麼我將保持相同的排名數字,否則我會將排名增加1.因此,基本上所有行都屬於到同一個項目將有相同的排名。
下面是我的代碼:
set @r := 0;
select min(start_date), max(end_date)
from (select start_date, end_date,
@r := if(datediff(end_date, @e) = 1, @r, @r+1) ranking,
@e := end_date
from projects
order by start_date
) b
group by ranking
order by datediff(max(end_date), min(start_date)), 1
;
但這種代碼是行不通的。
更新
使得根據薩沙Pachev的答案,修改後,當我試圖檢查子查詢:
set @r = 0;
select start_date, end_date,
@e := end_date, datediff(end_date, date(@e)),
@r := if(datediff(end_date, date(@e)), @r, @r+1) ranking
from projects
order by start_date
;
,我發現我所有的日期差異是0:
2015-10-01 2015-10-02 2015-10-02 0 1
2015-10-02 2015-10-03 2015-10-03 0 2
2015-10-03 2015-10-04 2015-10-04 0 3
2015-10-04 2015-10-05 2015-10-05 0 4
2015-10-11 2015-10-12 2015-10-12 0 5
2015-10-12 2015-10-13 2015-10-13 0 6
2015-10-15 2015-10-16 2015-10-16 0 7
2015-10-17 2015-10-18 2015-10-18 0 8
2015-10-19 2015-10-20 2015-10-20 0 9
我明白爲什麼,因爲我在分配排名@r之前將@e指定爲結束日期。但是如果我在@r之後指定@e,它不起作用,因爲我需要@e爲diffdate()函數獲取一個值。 有人可以幫我打破這個循環嗎?
你能儘量明確鑄造日期的DATETIME類型?這可能是因爲它們存儲爲VARCHAR,並且不能隱式轉換。 – ryansin
嗨@Sinfieldd,感謝您的建議!我確實嘗試在我的子查詢測試代碼中使用「Date(@e)」。它工作不正常。 :/ – alwaysaskingquestions