2010-05-03 149 views
2

我需要检索特定时间段的数据。 查询工作正常,直到我指定时间段。我指定时间段的方式有什么问题吗?我知道在这个时间范围内有很多条目。MySQL查询不返回任何数据

该查询返回空:

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 format Data加载到MySQL中。

查询应该为给定的公共汽车站提供停靠时间和公交路线。 对于一个公共汽车站,我想获得:

  1. 路由名称
  2. 总线名称
  3. 总线方向(HEADSIGN)
  4. 停止时间 结果应该只有1只限于公交车时间分钟前至20分钟。

请让我知道,如果你可以帮助。

UPDATE 问题是我比较DATE到DATETIME作为一个答案说。 我无法使用DATE,因为我的值有时间但没有日期。 所以我的解决方案是使用Unix时间:

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)); 

回答

1

停止时间是一个时间值,并与日期时间字段DATE_ADD/SUB工作。确保它们都是相同的类型。

1

试试这个:

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子句的需要。

+0

仍为空集。 – 2010-05-03 18:18:46

1

请勿使用除输出以外的合成列停止时间。

我觉得您的查询应该是这样的:

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> 

你写的应该总是返回true的HAVING条款,所以我猜这不是你真正的初衷是什么。