2013-08-21 3 views
1

Я искал Google и SO за последние 25 минут, чтобы узнать, как сделать следующее в MySQL.Подсчет строк на дату в диапазоне дат

настоящее время у меня следующий запрос (отправляемые PHP):

SELECT 
    COUNT(*), 
    `$db`.`crop`.`id` AS `crop`, 
    `$db`.`crop`.`harvest_date` AS `harvest_date` 
FROM 
    `$db`.`crop` 
WHERE 
    `$db`.`crop`.`harvest_date` BETWEEN $startDate AND $endDate 
GROUP BY `$db`.`crop`.`harvest_date` 

$startDate = 2012-01-01 
$endDate = 2013-07-01 

Я пытаюсь найти все строки, которые имеют harvest_date между датами начала и окончания, а затем подсчитать количество строк, которые падают в тот же день. Однако, похоже, я не получаю никаких результатов. Запрос не терпит неудачу, он просто ничего не возвращает. Может ли кто-нибудь указать мне в правильном направлении/сказать мне, где я ошибался?

EDIT: Нашел проблему. Как отметил Майкл ниже, даты не принимались как даты, а как цифры. Я решил это, добавив «до и после startDate и endDate в запросе.

+1

Запрос должен быть сбой. Ваши литералы о дате должны быть строками с одним кавычком.как в '$ startDate = '2012-01-01'' –

+1

Когда вы группируете' harvest_date', вы должны использовать какую-то агрегатную функцию (например, 'min()', 'max()' или 'group_concat () ') для' id'. – cars10m

+0

Какой тип 'harvest_date'? –

ответ

3

MySQL ожидает, что литералы даты будут одинарными кавычками, например '2012-01-01' и '2013-07-01'.

Поскольку вы не цитировали ваши литераторы даты, которые являются переменными PHP, PHP на самом деле интерпретирует их как арифметику для целочисленных значений, прежде чем передает их в запрос.

// You see this: 
$startDate = 2012-01-01 
$endDate = 2013-07-01 

// PHP does this: 
// 2012 - 1 - 1 = 2010 
$startDate = 2010 
// 2013 - 7 - 1 = 2005 
$endDate = 2005 

Ваш запрос в конечном счете использует это:

WHERE 
    `$db`.`crop`.`harvest_date` BETWEEN 2010 AND 2005 

И MySQL будет отбрасывать оба этих чисел к DATE, который будет возвращать NULL.

mysql> SELECT CAST(2010 AS DATE); 
+--------------------+ 
| CAST(2010 AS DATE) | 
+--------------------+ 
| NULL    | 
+--------------------+ 

Так простое исправление:

$startDate = '2012-01-01'; 
$endDate = '2013-07-01'; 

И если вы в конечном итоге преобразовать это параметризованные запросы, правильное цитирование заполнителей будет обрабатываться для вас.

1

Чтобы получить счетчик между заданным диапазоном дат. Измените запрос в

SELECT 
    COUNT(`$db`.`crop`.`id`), 
FROM 
    `$db`.`crop` 
WHERE 
    `$db`.`crop`.`harvest_date` BETWEEN $startDate AND $endDate 

Группировка результата с «harvest_date» будет определять количество для этой конкретной даты и группировать их.

пример: если таблица как

8-21-2013

8-21-2013

8-20-2013

затем группировка даст

без группировки

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