【问题标题】:Determining pairs of arrival and departures to calculate time spent at destination确定到达和离开的对以计算在目的地花费的时间
【发布时间】:2023-04-04 19:38:02
【问题描述】:

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

【问题讨论】:

  • 哪个 dbms?如果您可以使用解析函数LAG 可能就是您想要的。
  • 在这种情况下是 MSSQL 2012
  • 无法将其添加为答案,因为它不完整,但也许它可以以某种方式帮助您:选择 b.time 作为出发,a.time 作为到达,(b.time-a .time) as times 从 Flights a join Flights b on a.acid = b.acid where a.status = 'A' and b.status = 'D' 它还没有处理那些 ACID 重复记录。
  • @FilipeYaBaPolido 这真的行不通...sqlfiddle.com/#!2/4ab76d/1
  • 在这里工作,但它不完整,我知道。我试图指出一个方向,而不是一个完整的解决方案,如果是这样,我会发布作为答案。

标签: sql sql-server-2012


【解决方案1】:

试试这个解决方案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

【讨论】:

    【解决方案2】:

    这里有一些可以帮助你的东西——我只包含了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 函数来计算差异。

    【讨论】:

    • 有趣.. 我最终返回了 28 行(正好是两倍)。我不应该期待同样的(14)吗? sqlfiddle.com/#!6/48c90/4
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多