Использование Date_Sub для вычитания года с колонкой псевдонимов

У меня две колонки brand а также date_time и во время выбора я назначаю их псевдонимам. Запрос ниже:

SELECT brand,
YEAR(date_time) AS 'year',
SUM( brand = 'KFC' ) AS kfc
SUM( brand = 'PZH' ) AS pzh,
SUM( brand = 'SUB' ) AS sub
FROM scan_report
GROUP BY YEAR(date_time)

Результат к этому:

введите описание изображения здесь

Теперь вот запутанная часть. Как я могу использовать Date_Sub функция отображения данных только за последние 5 лет. Я имею в виду пользователь войдет 2014 и будет отображать / выбирать только записи за последние 5 лет, что означает от 2010 to 2014,

С помощью WHERE такие как это дали мне пустые записи:

SELECT
YEAR(date_time) AS 'year',
SUM( brand = 'KFC' ) AS kfc
SUM( brand = 'PZH' ) AS pzh,
SUM( brand = 'SUB' ) AS sub
FROM scan_report WHERE DATE_SUB(2014, INTERVAL 5 YEAR)
GROUP BY YEAR(date_time)

или это

FROM scan_report WHERE DATE_SUB(year = 2014, INTERVAL 5 YEAR)

Любая идея, как я могу получить запись за последние 5 лет пользовательского ввода? Я предпочитаю решать эту проблему с MySQL, если не найдено решение, чем я пойду с php. Заранее спасибо.

-1

Решение

Сделайте эту простую математику в PHP:

$year = 2014; # from $_POST or anywhere else
$from = ($year - 4) . '-01-01 00:00:00';
$to = $year . '-12-31 23:59:59';

А затем использовать эти 2 переменные в запросе.

$sql = "...
WHERE date_time BETWEEN '$from' AND '$to'
...
";

демонстрация

ОБНОВЛЕНИЕ (расчет в SQL):

Если вы не хотите рассчитывать в PHP, вы можете рассчитать в MySQL:

$sql = "...
WHERE
date_time BETWEEN CONCAT({$year}-4, '-01-01 00:00:00') AND CONCAT({$year}, '-12-31 23:59:59')
...
";

ОБНОВЛЕНИЕ (не волнует скорость или индексы):

$sql = "...
WHERE
YEAR(date_time) AND {$year}-4 AND {$year}
...
";
1

Другие решения

Ваша проблема в том, что предикат в предложении WHERE возвращает NULL для каждой строки, поэтому строки не возвращаются.

DATE_SUB Функция принимает выражение DATE в качестве первого аргумента, а не целое число. То есть вы могли бы указать '2014-01-01' в качестве первого аргумента, а не 2014, Это вернуло бы ненулевую дату, которая оценивалась бы как ИСТИНА (в логическом контексте), поэтому все строки были бы возвращены.

Чтобы включить строки, которые имеют конкретные значения date_timeвам нужно использовать сравнение в предикате (предложение WHERE). Чтобы вернуть строки со значениями date_time ‘2009-01-01’ и позже …

SELECT YEAR(t.date_time)      AS year
, SUM( t.brand = 'KFC' ) AS kfc
, SUM( t.brand = 'PZH' ) AS pzh
, SUM( t.brand = 'SUB' ) AS sub
FROM scan_report t
WHERE t.date_time >= DATE_SUB('2014-01-01', INTERVAL 5 YEAR)
GROUP BY YEAR(date_time)

Некоторые дополнительные примечания: если вам нужно (или вы хотите) экранировать идентификатор (например, имя столбца, потому что это зарезервированное слово), заключите идентификатор в символы обратной кавычки, а не в одинарные кавычки, например.

SELECT YEAR(`t`.`date_time`)  AS `year`
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector