SQL WeekOfYear () останавливается в конце года. Альтернативы? - PullRequest
0 голосов
/ 22 января 2020

У меня есть запрос, который выполняется на основе диапазона дат, который выбирает пользователь. Например: с 12-12-2019 по 1-13-2020.

// Retrieve count of attendance, no shows and cancellations per user selected category and sort by week number
   $q = "SELECT YEARWEEK(`start_time`, 0) AS weekno,
    SUM(`is_no_show` = 0 AND `is_cancelled` = 0) as attended,
    SUM(`is_no_show` = 1) AS no_shows,
    SUM(`is_cancelled` = 1)AS cancelled
  FROM `myTable`
  WHERE (`start_time` > :start_date  AND `start_time` < :end_date)
  AND category LIKE :cohort_type
  GROUP BY weekno";

Моя проблема заключается в том, что этот запрос перестает получать данные после 12-23-2019. Кажется, что он останавливается в последнюю неделю года, а не go в 2020 году, как неделя 1. Как я могу объяснить это? Будем благодарны за любые предложения или советы!

Спасибо.

Общая структура БД:

+------------+-----------+-----------+
| start_time |  no_shows | cancelled | 
+------------+-----------+-----------+
| 2019-12-20 |     1     |     0     |   
| 2019-12-21 |     0     |     0     |  
| 2019-12-22 |     0     |     1     | 

ЦЕЛЬ: Я хочу СУМКУ данных еженедельно

EDIT: YEARWEEK () пропускает первую неделю 2020 года и переходит прямо к неделе 2.

1 Ответ

1 голос
/ 22 января 2020

В вашем запросе отсутствуют критерии GROUP BY по году; на данный момент он будет смешивать недели, принадлежащие разным годам, что, я полагаю, не то, что вы хотите. Я бы предложил использовать YEARWEEK(), который учитывает год.

Кроме того, ваш анализ даты кажется неудобным, поскольку он смешивает параметры и конкатенацию строк; вместо этого вы можете использовать полуоткрытые интервалы (и правильные привязки параметров).

Учитывайте:

SELECT 
    YEARWEEK(`start_time`) AS weekno,
    SUM(`is_no_show` = 0 AND `is_cancelled` = 0) attended,
    SUM(`is_no_show` = 1) no_shows,
    SUM(`is_cancelled` = 1) cancelled
FROM `attendee_categories_appts_joined`
WHERE 
    `start_time` > :start_date 
    AND `start_time` < :end_date
    AND category LIKE :cohort_type 
GROUP BY weekno
...