MySQL запрос не возвращает никаких данных - PullRequest
2 голосов
/ 03 мая 2010

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

Этот запрос возвращает пустое значение:

SELECT  stop_times.stop_id, STR_TO_DATE(stop_times.arrival_time, '%H:%i:%s') as stopTime, routes.route_short_name, routes.route_long_name, trips.trip_headsign  FROM trips 
JOIN stop_times ON trips.trip_id = stop_times.trip_id 
JOIN routes ON routes.route_id = trips.route_id
WHERE  stop_times.stop_id = 5508
HAVING stopTime BETWEEN DATE_SUB(stopTime,INTERVAL 1 MINUTE) AND  DATE_ADD(stopTime,INTERVAL 20 MINUTE);

Вот это ОБЪЯСНЕНИЕ:

+----+-------------+------------+--------+------------------+---------+---------+-------------------------------+------+-------------+
| id | select_type | table      | type   | possible_keys    | key     | key_len | ref                           | rows | Extra       |
+----+-------------+------------+--------+------------------+---------+---------+-------------------------------+------+-------------+
|  1 | SIMPLE      | stop_times | ref    | trip_id,stop_id  | stop_id | 5       | const                         |  605 | Using where |
|  1 | SIMPLE      | trips      | eq_ref | PRIMARY,route_id | PRIMARY | 4       | wmata_gtfs.stop_times.trip_id |    1 |             |
|  1 | SIMPLE      | routes     | eq_ref | PRIMARY          | PRIMARY | 4       | wmata_gtfs.trips.route_id     |    1 |             |
+----+-------------+------------+--------+------------------+---------+---------+-------------------------------+------+-------------+
3 rows in set (0.00 sec)

Запрос работает, если я удалю предложение HAVING (не указывайте временной диапазон). Возвращает:

+---------+----------+------------------+-----------------+---------------+
| stop_id | stopTime | route_short_name | route_long_name | trip_headsign |
+---------+----------+------------------+-----------------+---------------+
|    5508 | 06:31:00 | "80"             | ""              | "FORT TOTTEN" |
|    5508 | 06:57:00 | "80"             | ""              | "FORT TOTTEN" |
|    5508 | 07:23:00 | "80"             | ""              | "FORT TOTTEN" |
|    5508 | 07:49:00 | "80"             | ""              | "FORT TOTTEN" |
|    5508 | 08:15:00 | "80"             | ""              | "FORT TOTTEN" |
|    5508 | 08:41:00 | "80"             | ""              | "FORT TOTTEN" |
|    5508 | 09:08:00 | "80"             | ""              | "FORT TOTTEN" |

Я использую Данные Google Transit в формате , загруженные в MySQL.

Предполагается, что в запросе указывается время остановки и автобусные маршруты для данной автобусной остановки. Для остановки я пытаюсь получить:

  1. Название маршрута
  2. Название автобуса
  3. Направление автобуса (головной знак)
  4. Время остановки Результаты должны быть ограничены только временем движения автобусов от 1 минуты назад до 20 минут с этого момента.

Пожалуйста, дайте мне знать, если вы могли бы помочь.

UPDATE Проблема заключалась в том, что я сравнивал DATE с DATETIME, как сказал один из ответов. Я не мог использовать ДАТУ, потому что у моих значений были времена, но не даты. Поэтому я решил использовать Unix time:

 SELECT  stop_times.stop_id, stop_times.trip_id,   UNIX_TIMESTAMP(CONCAT(DATE_FORMAT(NOW(),'%Y-%m-%d '), stop_times.arrival_time)) as stopTime, routes.route_short_name, routes.route_long_name, trips.trip_headsign  FROM trips 
JOIN stop_times ON trips.trip_id = stop_times.trip_id 
JOIN routes ON routes.route_id = trips.route_id
WHERE  stop_times.stop_id = 5508
HAVING stopTime > (UNIX_TIMESTAMP(NOW()) - 60) AND stopTime < (UNIX_TIMESTAMP(NOW()) + (60*20));

Ответы [ 3 ]

1 голос
/ 03 мая 2010

Попробуйте вместо этого:

SELECT * FROM
(SELECT  stop_times.stop_id, STR_TO_DATE(stop_times.arrival_time, '%H:%i:%s') as stopTime, routes.route_short_name, routes.route_long_name, trips.trip_headsign  FROM trips 
JOIN stop_times ON trips.trip_id = stop_times.trip_id 
JOIN routes ON routes.route_id = trips.route_id
WHERE  stop_times.stop_id = 5508) AS qu_1
WHERE qu_1.stopTime BETWEEN DATE_SUB(qu_1.stopTime,INTERVAL 1 MINUTE) AND  DATE_ADD(qu_1.stopTime,INTERVAL 20 MINUTE);

Должен предупредить вас, я не проверял это, но это устраняет необходимость в предложении HAVING.

1 голос
/ 03 мая 2010

Не работать с синтетическим столбцом stopTime, кроме как с выходным.

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

SELECT  stop_times.stop_id, STR_TO_DATE(stop_times.arrival_time, '%H:%i:%s') as stopTime, routes.route_short_name, routes.route_long_name, trips.trip_headsign  FROM trips 
JOIN stop_times ON trips.trip_id = stop_times.trip_id 
JOIN routes ON routes.route_id = trips.route_id
WHERE  stop_times.stop_id = 5508
AND arrival_time BETWEEN <something> AND <something else>

Предложение HAVING, которое вы написали, должно всегда возвращать true, так что я предполагаю, что это не то, что вы действительно имели в виду.

1 голос
/ 03 мая 2010

Stoptime - это значение времени, а DATE_ADD / SUB работают с полями datetime. Убедитесь, что они оба одного типа.

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