2016-01-17 3 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); 

Это результат , последние 2 строки с 2016 года неверны, я в скобках вернул правильное значение, которое я ожидаю:

 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) - это то, что вам нужно. В разных базах данных может использоваться несколько иной синтаксис ...

Смежные вопросы