Php-MySql Query, выбор данных в соответствии с DateTime - PullRequest
4 голосов
/ 03 января 2012

Я хотел бы получить количество строк с одинаковой датой.Но одна секунда должна быть незначительной.

Например;2012-01-03 13:12:28 и 2012-01-03 13:12:27 должны восприниматься как одинаковые.

(у меня имя таблицы равно myTable, а имя столбца datetimedate)

Надеюсь, вы мне поможете ..

Ответы [ 4 ]

3 голосов
/ 03 января 2012

Это так же просто, как:

SELECT * FROM myTable WHERE date >= '2012-01-03 13:12:27' AND date <= '2012-01-03 13:12:28';

Если вы хотите создать его из переменной, вы можете сделать это:

$date = '2012-01-03 13:12:27';
$timestamp = strtotime($date);
$mysqli = new mysqli();

// Note: allowing 1 second either side, this is up to you
$lower = date('Y-m-d H:i:s', $timestamp - 1);
$upper = date('Y-m-d H:i:s', $timestamp + 1);

$stmt = $mysqli->prepare('SELECT * FROM myTable WHERE date >= ? AND date <= ?');
$stmt->bind_param('ss', $lower, $upper);
$stmt->execute();

РЕДАКТИРОВАТЬ : согласно вашему комментарию ниже, следующий SQL должен вернуть то, что вы ищете. Обратите внимание, что если дата содержит «2012-01-03 13:12:28», она будет учитываться как для 27, так и для 28.

SELECT
    upper_date,
    COALESCE(lower_count, 0) + upper_count
FROM
    (SELECT
        date AS upper_date,
        COUNT(1) AS upper_count
    FROM myTable
    GROUP BY date
    ) AS upper
LEFT JOIN
    (SELECT
        date - INTERVAL 1 SECOND AS lower_date,
        COUNT(1) AS lower_count
    FROM myTable
    GROUP BY date
    ) AS lower
ON upper.upper_date = lower.lower_date
0 голосов
/ 03 января 2012

Если вам нужно только посчитать количество строк на дату, это будет просто GROUP BY:

SELECT COUNT(*) as cnt, DATE_FORMAT(date, '%Y-%m-%d') as my_date
  FROM myTable
  GROUP BY my_date

Но по вашему вопросу вам нужно не только считать строки в дате, но и считать не одно событие, а его серию. В этом случае вам нужно определить, что именно серии. Скажем, два события в течение одной секунды следует считать одним. Что если есть четыре события с расстоянием 0,7 между собой? В этом случае я бы посоветовал считать серии в два этапа.

Первый порядок событий по времени:

SELECT * FROM myTable WHERE date >= XXXX and date < YYYY ORDER BY date ASC

Затем на стороне приложения вы можете посчитать разрыв между двумя записями и увеличить счетчик, если расстояние между двумя событиями закрытия превышает одну секунду.

Не забудьте добавить индекс в поле date, чтобы ускорить этот запрос.

0 голосов
/ 03 января 2012

Попробуйте это один раз:

SELECT count(*)
FROM myTable
WHERE DATE_FORMAT(date, '%Y-%m-%d %H:%i') = '2012-01-03 13:12';

Или для группового СЧЕТА:

SELECT DATE_FORMAT(date, '%Y-%m-%d %H:%i') as myDate, count(*)
FROM myTable
GROUP BY myDate;
0 голосов
/ 03 января 2012
SELECT p1.date, p1.sex, p2.date, p2.sex, p1.species ......
        FROM table_name AS p1, table_name AS p2
        WHERE p1.date-p2.species in(0,1);

Для таких случаев мы используем самостоятельное объединение таблицы с псевдонимами ... и, поскольку ваше условие состоит в том, что разница между датами не должна превышать 1, здесь она идет ...

Я предполагаю, что вы сохранили дату как mysql datetime ... для выполнения операции "-" ..

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