Количество строк добавлено сегодня, вчера ... и в другое время - PullRequest
4 голосов
/ 04 марта 2009

Сегодня мне дали хорошее направление для решения проблемы, но я застрял в попытке следовать этому направлению.

Я хотел бы получить счетчик для всех строк в таблице за последние 30 дней, используя мое поле даты. Я заполняю эти поля с помощью "now ()", и они имеют формат "2009-03-04 14:58:01".

  • Мне нужен счетчик для добавленных строк сегодня, вчера, 3 дня назад ... и т. д.
  • Полагаю, тогда я смогу использовать получить счет за каждый месяц?
  • Наконец, счет за год, год до и т. д., используя общее количество месяцев?

Я надеялся не указывать даты в своем запросе, а сделать запрос общим и рассчитать количество по сравнению с сегодняшним днем. Я также надеялся, что смогу сделать это точно, учитывая, что в разных месяцах разное количество дней.

Как я могу получить этот счет, используя только SQL ? Затем я могу использовать результирующий набор в виде массива и проанализировать его с помощью PHP.

Ответы [ 5 ]

7 голосов
/ 04 марта 2009

Количество записей, вставленных вчера:

select count(*) from mytable where date(myfield)=date(date_sub(now(),interval 1 day));

За год:

select count(*) from mytable where year(myfield)=year(now());

И так далее ...

2 голосов
/ 04 марта 2009

Я не совсем уверен, как выглядит ваша структура базы данных, но вы, вероятно, можете добиться того, чего хотите, используя GROUP BY:

Для агрегирования по дням:

SELECT date(my_date_field) d, count(*) c FROM tbl
GROUP BY d
ORDER BY d

Для агрегирования по месяцам:

SELECT year(my_date_field) y, month(my_date_field) m, count(*) c FROM tbl
GROUP BY y, m
ORDER BY y, m

Для агрегирования по годам можно просто удалить параметр месяца из приведенного выше примера.

Если вы хотите ограничить результат конкретными данными, вы можете использовать WHERE непосредственно на my_date_field или HAVING на d, y или m. Используйте DATE_SUB для вычисления даты относительно текущей.

2 голосов
/ 04 марта 2009

Посмотрите на MySQLs DATE_ADD и DATE_SUB , она даст вам то, что вы ищете.

0 голосов
/ 04 марта 2009

попробуйте это решение на основе группировки по дате, месяцу и году:

-- Testing data
DECLARE @TestTable TABLE(ID INT, AddDate DATETIME)
INSERT INTO @TestTable
SELECT 1, '2009-03-04 14:58:01' UNION
SELECT 1, '2009-05-14 14:58:01' UNION
SELECT 1, '2009-05-14 14:58:02' UNION
SELECT 1, '2009-05-24 14:58:01' UNION
SELECT 1, '2009-05-24 14:58:02' UNION
SELECT 1, '2009-05-24 14:58:03' UNION
SELECT 1, '2009-07-04 14:58:01' UNION
SELECT 1, '2009-09-04 14:58:01' UNION
SELECT 1, '2010-01-04 14:58:01' UNION
SELECT 1, '2010-03-04 14:58:01' UNION
SELECT 1, '2010-03-04 14:58:02'

-- MySQL Answer
-- for each day
SELECT EXTRACT(YEAR_MONTH_DAY, AddDate), COUNT(ID) FROM @TestTable
GROUP BY EXTRACT(YEAR_MONTH_DAY, AddDate)
-- for each month
SELECT EXTRACT(YEAR_MONTH, AddDate), COUNT(ID) FROM @TestTable
GROUP BY EXTRACT(YEAR_MONTH, AddDate)
-- for each year
SELECT EXTRACT(YEAR, AddDate), COUNT(ID) FROM @TestTable
GROUP BY EXTRACT(YEAR, AddDate)

-- SQL Answer
-- for each day
SELECT dateadd(day, datediff(day, 0, AddDate)+0, 0), COUNT(ID) 
FROM @TestTable
GROUP BY dateadd(day, datediff(day, 0, AddDate)+0, 0)
-- for each month
SELECT dateadd(month, datediff(month, 0, AddDate)+0, 0), COUNT(ID) 
FROM @TestTable
GROUP BY dateadd(month, datediff(month, 0, AddDate)+0, 0)
-- for each year
SELECT dateadd(year, datediff(year, 0, AddDate)+0, 0), COUNT(ID) 
FROM @TestTable
GROUP BY dateadd(year, datediff(year, 0, AddDate)+0, 0)
0 голосов
/ 04 марта 2009

Посмотрите на DATEDIFF ... Я не уверен в точном синтаксисе с mysql, но в итоге он должен быть примерно таким:

select * from Table WHERE datediff(StartDate, Today) < DaySpan
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...