2016-01-17 26 views
1

我想從數據庫中分組並顯示每週註冊用戶的數量。SQL:選擇不同年份之間的星期數

我的代碼幾乎是完美的,但它並沒有對2016年的工作是正確的,這裏是數據庫:

(1, '2013-10-14 16:22:10'), 
(2, '2013-12-28 16:22:10'), 
(3, '2014-01-03 16:22:10'), 
(4, '2014-01-08 16:22:10'), 
(5, '2014-06-22 16:22:10'), 
(6, '2014-12-19 16:22:10'), 
(7, '2014-12-27 16:22:10'), 
(8, '2015-01-01 16:22:10'), 
(9, '2015-01-07 16:22:10'), 
(10, '2015-12-12 16:22:10'), 
(11, '2015-12-28 16:22:10'), 
(12, '2015-12-29 16:22:10'), 
(13, '2016-01-05 16:22:10'), 
(14, '2016-01-10 16:22:10'), 
(15, '2016-01-15 16:22:10'); 

這是查詢:

select 
    str_to_date(concat(yearweek(reg_data), ' monday'), '%X%V %W') as startingweek, 
    YEAR(reg_data)*52+WEEK(reg_data, 1) - YEAR('2013-10-14')*52 - WEEK('2013-10-14', 1) + 1 as week_number, 
    count(a.reg_data) as nr 
from users as a 
group by yearweek(reg_data, 1) 
order by yearweek(reg_data, 1); 

這是結果,2016年的最後2排不正確,我在括號中輸入了我期待的正確值:

 startingweek  week_number nr 
October, 14 2013 00:00:00  1   1 
December, 23 2013 00:00:00 11   1 
December, 30 2013 00:00:00 12   1 
January, 06 2014 00:00:00  13   1 
June, 23 2014 00:00:00  36   1 
December, 15 2014 00:00:00 62   1 
December, 22 2014 00:00:00 63   1 
December, 29 2014 00:00:00 64   1 
January, 05 2015 00:00:00  65   1 
December, 07 2015 00:00:00 113   1 
December, 28 2015 00:00:00 116   2 
January, 04 2016 00:00:00  116 (117) 2 
January, 11 2016 00:00:00  117 (118) 1 

我知道問題是關於我在查詢中使用的週數 - > 52,因爲有些年份有53周,但我不知道如何根據年份動態改變。

而且我做了這裏sqlfiddle:http://sqlfiddle.com/#!9/1e5df5/2

回答

0

只需7更改計算的日期和開始日期和鴻溝之間的天數:

select str_to_date(concat(yearweek(reg_data), ' monday'), '%X%V %W') as startingweek, 

    floor(datediff(min(reg_data),'2013-10-14')/7)+1 as week_number, 

    count(a.reg_data) as nr 
      from users as a 
      group by yearweek(reg_data, 1) 
      order by yearweek(reg_data, 1); 

fiddle

+0

我試過你的查詢,你能告訴我它爲什麼顯示第2周,2次嗎? http://sqlfiddle.com/#!9/4c046/1 – Speedwheelftw

+0

@Lachesis:我沒有檢查所有可能的細節,但是使用了兩個不同的'yearweek'計算,應該是相同的。當您更改爲MAX(regdata)而不是MIN時,它似乎工作。否則,將開始日更改爲知道星期一,例如, '2013-10-07' – dnoeth

+0

謝謝,它的作品! – Speedwheelftw

0

許多數據庫都實現了datediff()函數。所以DATEDIFF(week, date1, date2)是你需要的。不同的數據庫可能會使用稍微不同的語法...

相關問題