【发布时间】:2015-04-07 22:57:00
【问题描述】:
我真的很难处理这个查询。任何帮助将不胜感激!
桌子:
+------+----------+--------------------+--------+-------------------+
|Ref |Dept |DeptTime |Arr |ArrTime |
+------+----------+--------------------+--------+-------------------+
|1 |New York |2015-02-01 08:00:00 |Boston |2015-02-01 09:00:00|
|1 |Boston |2015-02-01 10:00:00 |Chicago |2015-02-01 11:00:00|
|1 |Chicago |2015-02-01 12:00:00 |Dallas |2015-02-01 13:00:00|
|1 |Dallas |2015-02-02 11:00:00 |Seattle |2015-02-02 13:00:00|
|2 |London |2015-02-01 04:00:00 |Berlin |2015-02-01 16:00:00|
|2 |Berlin |2015-02-02 18:00:00 |Moscow |2015-02-02 23:00:00|
+------+----------+--------------------+--------+-------------------+
此表显示多站行程。如果到达和离开之间的中途停留时间少于 4 小时,则应将其视为同一行程的一部分。目的地应该是下一个出发时间超过四个小时的第一个到达时间。在这种情况下,我想显示出发城市和出发时间,以及最终到达目的地和到达时间。您可以在此问题的底部看到所需的输出示例。
我认为查询应该做的是选择具有相同 ref 的值(使用连接?),仅比较不同行的 ArrTime 和 DeptTime,如果差异大于 4 小时,则返回 Dept、DeptTime、多站旅程的 Arr 和 ArrTime。任何超过 4 小时的时间都被视为旅程的结束。
我尝试使用几个简单的查询,但是我不知道如何计算具有相同 Ref 的不同项目之间的 Datetime 差异,以及如何比较不同行之间的 ArrTime 和 DeptTime。
我在 StackOverflow 上发现了这种比较日期时间的方法,但是我得到的只是使用它时的语法错误。
DECLARE @date1 DATETIME;
DECLARE @date2 DATETIME;
SET @date1 = '2012-04-01 08:10:16';
SET @date2 = '2012-04-10 11:35:36';
编辑:查询后的最终输出表应如下所示:
+------+----------+--------------------+--------+-------------------+
|Ref |Dept |DeptTime |Arr |ArrTime |
+------+----------+--------------------+--------+-------------------+
|1 |New York |2015-02-01 08:00:00 |Dallas |2015-02-01 13:00:00|
|1 |Dallas |2015-02-02 11:00:00 |Seattle |2015-02-02 13:00:00|
|2 |London |2015-02-01 04:00:00 |Berlin |2015-02-01 16:00:00|
|2 |Berlin |2015-02-02 18:00:00 |Moscow |2015-02-02 23:00:00|
+------+----------+--------------------+--------+-------------------+
任何帮助将不胜感激!
【问题讨论】:
-
@Strawberry 谢谢,我明白了,这些只是为了便于阅读而格式化
-
为了获得帮助的最佳方式,使用标准格式(这里是 YYYY-MM-DD HH:MM:SS,MySQL 使用),因为它对其他用户来说更清楚。
-
您在标题中写道,您想显示层数大于 4 小时的位置,但在描述中写下“少于 4 小时”。那你想要哪一个?
-
抱歉搞砸了@Fenistil,我更改了标题和日期时间格式。如果有任何不清楚的地方,请告诉我。
-
我认为在您的应用程序(如 php)中比在 MySQL 中更容易。在 SQL 中,您主要可以一次处理 1 行。所以你应该在这里使用很多子选择,这在 MySQL 中非常慢,这使得整个查询非常复杂。但如果你能在某种应用程序中做到这一点,那就很容易了。
标签: mysql sql time-series