我正在尝试编写一个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
答案 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