确定到达和离开对以计算在目的地花费的时间

时间:2014-02-21 21:44:08

标签: sql sql-server-2012

我正在尝试编写一个SQL查询,让我知道根据到达和离开时间在特定机场停留的时间。

CREATE TABLE Flights
    (`ACID` varchar(6), `TIME` datetime, `STATUS` varchar(1))
;

INSERT INTO Flights
    (`ACID`, `TIME`, `STATUS`)
VALUES
    ('XXXX', '2014-01-01 18:09:00', 'A'),
    ('XXXX', '2014-01-02 15:25:00', 'D'),
    ('XXXX', '2014-01-06 19:53:00', 'A'),
    ('XXXX', '2014-01-07 14:01:00', 'D'),
    ('XXXX', '2014-01-12 16:06:00', 'A'),
    ('XXXX', '2014-01-12 17:00:00', 'D'),
    ('YYYY', '2014-01-13 18:10:00', 'A'),
    ('YYYY', '2014-01-13 18:56:00', 'D'),
    ('XXXX', '2014-01-16 20:40:00', 'A'),
    ('XXXX', '2014-01-17 14:49:00', 'D'),
    ('ZZZZ', '2014-01-17 21:42:00', 'A'),
    ('ZZZZ', '2014-01-17 22:17:00', 'D'),
    ('XXXX', '2014-01-21 00:30:00', 'A'),
    ('XXXX', '2014-01-23 15:35:00', 'D')
;

状态行是“A”表示抵达,“D”表示离开。

输出应该通过ACID字段汇总花费的时间(出发和到达时间之间的差异)。

可能存在到达记录但没有匹配的出发记录的情况。

我正在艰难地“确定对子”,以便我可以做日期差异等。

RDBMS是MSSQL 2012

2 个答案:

答案 0 :(得分:0)

以下内容可以帮助您解决这个问题 - 我只添加了datetime列;如果需要,可以添加其他列:

SELECT A.ArrivalTime, D.DepartureTime 
FROM (SELECT TIME AS ArrivalTime, ACID
      FROM  Flights
      WHERE STATUS = 'A') A
CROSS JOIN (SELECT TIME AS DepartureTime, ACID
           FROM FLIGHTS
           WHERE STATUS = 'D') D
WHERE   A.ArrivalTime < D.DepartureTime
AND     A.ACID = D.ACID

您可以使用DATEDIFF函数计算差异。

答案 1 :(得分:0)

尝试此解决方案http://sqlfiddle.com/#!6/48c90/17

SELECT ACID, DATEDIFF(HH, TIME ,
(SELECT TOP 1 b.TIME FROM Flights b WHERE b.STATUS = 'D' AND b.TIME > a.TIME))
FROM  Flights a
WHERE STATUS = 'A'

它给你这个结果:

| ACID | COLUMN_1 |
|------|----------|
| XXXX |       21 |
| XXXX |       19 |
| XXXX |        1 |
| YYYY |        0 |
| XXXX |       18 |
| ZZZZ |        1 |
| XXXX |       63 |

您可以将DATEDIFF(HH更改为DATEDIFF(DD,以便在几天内实现差异。

看看here