0
我對SQL非常陌生,所以如果我使用了錯誤的術語,並且我編寫的代碼是可怕的,我很抱歉。計算兩個日期之間每月的天數 - SQL
我試圖創建一個查詢來輸出每年每月的天數。我所創建的測試表datetest
:
startdate enddate
2105-12-16 2016-02-15
2017-01-01 2017-01-02
,並使用粘貼下面的查詢我得到如下結果:
Year Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2015 31 15 0 0 0 0 0 0 0 0 0 16
2017 4 0 0 0 0 0 0 0 0 0 0 0
我遇到的問題是,當日期範圍變爲超過兩年結果落在開始日期年份而不是實際年份。
如果有人可以幫助我真的很感激它 感謝
查詢
SELECT
year(startdate) AS Year,
SUM(GREATEST(datediff(least(CAST(CONCAT(YEAR(startdate), '-01-31') AS DATETIME),enddate),greatest(CAST(CONCAT(YEAR(startdate), '-01-01') AS DATETIME),startdate))+1,0))+SUM(GREATEST(datediff(least(CAST(CONCAT(YEAR(enddate), '-01-31') AS DATETIME),enddate),greatest(CAST(CONCAT(YEAR(enddate), '-01-01') AS DATETIME),startdate))+1,0)) AS "Jan",
SUM(GREATEST(datediff(least(CAST(CONCAT(YEAR(startdate), '-02-28') AS DATETIME),enddate),greatest(CAST(CONCAT(YEAR(startdate), '-02-01') AS DATETIME),startdate))+1,0))+SUM(GREATEST(datediff(least(CAST(CONCAT(YEAR(enddate), '-02-28') AS DATETIME),enddate),greatest(CAST(CONCAT(YEAR(enddate), '-02-01') AS DATETIME),startdate))+1,0)) AS "Feb",
SUM(GREATEST(datediff(least(CAST(CONCAT(YEAR(startdate), '-03-31') AS DATETIME),enddate),greatest(CAST(CONCAT(YEAR(startdate), '-03-01') AS DATETIME),startdate))+1,0))+SUM(GREATEST(datediff(least(CAST(CONCAT(YEAR(enddate), '-03-31') AS DATETIME),enddate),greatest(CAST(CONCAT(YEAR(enddate), '-03-01') AS DATETIME),startdate))+1,0)) AS "Mar",
SUM(GREATEST(datediff(least(CAST(CONCAT(YEAR(startdate), '-04-30') AS DATETIME),enddate),greatest(CAST(CONCAT(YEAR(startdate), '-04-01') AS DATETIME),startdate))+1,0))+SUM(GREATEST(datediff(least(CAST(CONCAT(YEAR(enddate), '-04-30') AS DATETIME),enddate),greatest(CAST(CONCAT(YEAR(enddate), '-04-01') AS DATETIME),startdate))+1,0)) AS "Apr",
SUM(GREATEST(datediff(least(CAST(CONCAT(YEAR(startdate), '-05-31') AS DATETIME),enddate),greatest(CAST(CONCAT(YEAR(startdate), '-05-01') AS DATETIME),startdate))+1,0))+SUM(GREATEST(datediff(least(CAST(CONCAT(YEAR(enddate), '-05-31') AS DATETIME),enddate),greatest(CAST(CONCAT(YEAR(enddate), '-05-01') AS DATETIME),startdate))+1,0)) AS "May",
SUM(GREATEST(datediff(least(CAST(CONCAT(YEAR(startdate), '-06-30') AS DATETIME),enddate),greatest(CAST(CONCAT(YEAR(startdate), '-06-01') AS DATETIME),startdate))+1,0))+SUM(GREATEST(datediff(least(CAST(CONCAT(YEAR(enddate), '-06-30') AS DATETIME),enddate),greatest(CAST(CONCAT(YEAR(enddate), '-06-01') AS DATETIME),startdate))+1,0)) AS "Jun",
SUM(GREATEST(datediff(least(CAST(CONCAT(YEAR(startdate), '-07-31') AS DATETIME),enddate),greatest(CAST(CONCAT(YEAR(startdate), '-07-01') AS DATETIME),startdate))+1,0))+SUM(GREATEST(datediff(least(CAST(CONCAT(YEAR(enddate), '-07-31') AS DATETIME),enddate),greatest(CAST(CONCAT(YEAR(enddate), '-07-01') AS DATETIME),startdate))+1,0)) AS "Jul",
SUM(GREATEST(datediff(least(CAST(CONCAT(YEAR(startdate), '-08-31') AS DATETIME),enddate),greatest(CAST(CONCAT(YEAR(startdate), '-08-01') AS DATETIME),startdate))+1,0))+SUM(GREATEST(datediff(least(CAST(CONCAT(YEAR(enddate), '-08-31') AS DATETIME),enddate),greatest(CAST(CONCAT(YEAR(enddate), '-08-01') AS DATETIME),startdate))+1,0)) AS "Aug",
SUM(GREATEST(datediff(least(CAST(CONCAT(YEAR(startdate), '-09-30') AS DATETIME),enddate),greatest(CAST(CONCAT(YEAR(startdate), '-09-01') AS DATETIME),startdate))+1,0))+SUM(GREATEST(datediff(least(CAST(CONCAT(YEAR(enddate), '-09-30') AS DATETIME),enddate),greatest(CAST(CONCAT(YEAR(enddate), '-09-01') AS DATETIME),startdate))+1,0)) AS "Sep",
SUM(GREATEST(datediff(least(CAST(CONCAT(YEAR(startdate), '-10-31') AS DATETIME),enddate),greatest(CAST(CONCAT(YEAR(startdate), '-10-01') AS DATETIME),startdate))+1,0))+SUM(GREATEST(datediff(least(CAST(CONCAT(YEAR(enddate), '-10-31') AS DATETIME),enddate),greatest(CAST(CONCAT(YEAR(enddate), '-10-01') AS DATETIME),startdate))+1,0)) AS "Oct",
SUM(GREATEST(datediff(least(CAST(CONCAT(YEAR(startdate), '-11-30') AS DATETIME),enddate),greatest(CAST(CONCAT(YEAR(startdate), '-11-01') AS DATETIME),startdate))+1,0))+SUM(GREATEST(datediff(least(CAST(CONCAT(YEAR(enddate), '-11-30') AS DATETIME),enddate),greatest(CAST(CONCAT(YEAR(enddate), '-11-01') AS DATETIME),startdate))+1,0)) AS "Nov",
SUM(GREATEST(datediff(least(CAST(CONCAT(YEAR(startdate), '-12-31') AS DATETIME),enddate),greatest(CAST(CONCAT(YEAR(startdate), '-12-01') AS DATETIME),startdate))+1,0))+SUM(GREATEST(datediff(least(CAST(CONCAT(YEAR(enddate), '-12-31') AS DATETIME),enddate),greatest(CAST(CONCAT(YEAR(enddate), '-12-01') AS DATETIME),startdate))+1,0)) AS "Dec"
from datetest
GROUP BY year(startdate)
哪個rdbms? sql-server,mysql,oracel,...? – Matt
'2105-12-16'?這應該是2016年之前的一年? – wallyk
我確定你做了一件可怕的事情:d –