Как обновить Query для расчета суммы или счета, используя две даты и между? - PullRequest
0 голосов
/ 08 июня 2019

Мой текущий запрос таков:

     SELECT
      CAST(COUNT(`MID`) AS UNSIGNED) AS Y,
      CONCAT(
          LEFT(MONTHNAME(`date`),
          3),
          ' ',
          YEAR(`date`)
      ) AS label
  FROM
      `reservations`
  WHERE
      `MID` = 22 AND YEAR(`date`) = YEAR(CURDATE())
  GROUP BY
      CONCAT(
          LEFT(MONTHNAME(DATE),
          3),
          ' ',
          YEAR(`date`)
      ),
      YEAR(DATE),
      MONTH(DATE)
  ORDER BY
      YEAR(`date`),
      MONTH(`date`) ASC

Это дает следующие результаты, которые мы используем в Google Charts, чтобы показать количество бронирований в месяц. Проблема в том, что мы получаем только количество созданных резервирований, а не количество дней между начальной датой (date) и конечной датой (dateLast).

 Y      label
 ________________
 22      Feb 2019
 28      Mar 2019
 15      Apr 2019
 3       May 2019
 5       Jun 2019
 2       Jul 2019
 1       Aug 2019
 1       Oct 2019
 2       Nov 2019
 9       Dec 2019

Я пробовал следующее обновление, но получил ошибку, связанную с оператором BETWEEN:

 SELECT
     CAST(COUNT(`mid`) AS UNSIGNED BETWEEN `date` AND `dateLast`) AS D, CONCAT(
         LEFT(MONTHNAME(DATE),
         3), ' ',  YEAR(DATE) ),
     CAST(COUNT(`mid`) AS UNSIGNED) AS Y,
     CONCAT(
         LEFT(MONTHNAME(DATE),
         3),
         ' ',
         YEAR(DATE)
     ) AS label
 FROM
     `reservations`
 WHERE
     `mid` = 22 AND YEAR(DATE) = YEAR(CURDATE())
 GROUP BY
     CONCAT(
         LEFT(MONTHNAME(DATE),
         3),
         ' ',
         YEAR(DATE)
     ),
     YEAR(DATE),
     MONTH(DATE)
 ORDER BY
     YEAR(DATE),
     MONTH(DATE) ASC

MySQL сказал: Документация

У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса, который можно использовать рядом с 'BETWEEN date AND dateLast) AS D, CONCAT (LEFT (MONTHNAME (DATE))' в строке 2

Цель состоит в том, чтобы получить СУММУ за все дни, зарезервированные между AND, включая date до dateLast Примечание: dateLast не учитывается, поскольку это дата оформления заказа. Может быть, это слишком сложно для SQL-запроса и должно обрабатываться в PHP как ряд подпрограмм?

Ответы [ 2 ]

1 голос
/ 08 июня 2019

Если вам не нужно разделять количество дней одного бронирования на несколько месяцев, то вы можете просто использовать SUM (DATEDIFF (dateLast, date))

select year(date) y, month(date) m, sum(datediff(dateLast, date)) c
from reservations
group by y, m
order by y, m

db-fiddle

Если вы хотите разделить их, то я надеюсь, что ваша версия (MySQL 8+ или MariaDB 10.2+) поддерживает рекурсивные запросы.В этом случае вы можете расширить диапазон дат до одной строки в день в диапазоне и подсчитать их:

with recursive rcte as (
  select date, dateLast 
  from reservations
  where dateLast > date -- optional
  union all
  select rcte.date + interval 1 day, rcte.dateLast
  from rcte
  where rcte.date < rcte.dateLast - interval 1 day
)
  select year(date) y, month(date) m, count(*) c
  from rcte
  group by y,m
  order by y,m

db-fiddle

1 голос
/ 08 июня 2019

SQL определенно может справиться с этим. Используйте функцию DATEDIFF https://www.w3schools.com/sql/func_mysql_datediff.asp

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...