mysql - 如何减去日期,然后将上一次运算的结果相加

标签 mysql

我有一个包含飞机表、航类表的数据库,它基本上是飞机所做的一次航类,然后对于每个航类,我都解决了 M:N 表,该表只保存航类和目的地的外键,表中的 2 个条目目的地,要了解出发和到达之间的区别,表目的地与表类型有连接(出发和到达,在另一个表中设置,共 2 行,“Zacetna”=出发,“Koncna”=到达)。表目标还具有与包含日期时间的表日期的连接。

我想减去每个航类的到达和出发时间,然后将时间相加(如果飞机有多个航类)。

我尝试将它们全部减去,然后再进行分割,但这不起作用,然后我尝试进行分组,但没有成功。

在附图中。 名为“Falcon FX 3000”的飞机有 2 个航类,idFlight 5 和 6。为了获得预期结果,我必须这样做

(Destination_6_Date - Destination_5_Date) + (Destination_4_Date - Destination_7_Date) 但我的解决方案都不起作用

SELECT d.Ime, letD.Destinacija_idDestinacija, l.idLet,tip.Tip,  t.Termin
FROM Letalo p
INNER JOIN Let l ON l.Letalo_idLetalo = p.idLetalo
INNER JOIN Let_Has_Destinacija letD on letD.Let_idLet = l.idLet
INNER JOIN Destinacija d on d.idDestinacija = letD.Destinacija_idDestinacija
INNER JOIN Termin t on t.idTermin = d.Termin_idTermin
INNER JOIN Tip_Destinacije tip on tip.idTip_Destinacije = Tip_Destinacije_idTip_Destinacije WHERE p.Naziv='Falcon FX 3000';

https://i.imgur.com/5r2G9yI.png

https://i.imgur.com/3CIfbUN.png

Sorry for the ERDiagram for being in the different language
Letalo = Plane
Let = Flight
Let_Has_Destinacija = Solved M:N, holding Flight ID and Destination ID
Destinacija = Destination
Termin = Date
Tip_Destinacija = Type

编辑 这是成功的 GROUP BY 查询,它返回有效的计算结果,现在我只需要对它们求和。我猜这将通过子查询来完成,但我不太明白,因为我是 MySQL 的新手

SELECT d.Ime as Name, letD.Destinacija_idDestinacija as Destination, l.idLet as idFlight,tip.Tip as Type,  CAST(t.Termin as DATE), timediff(Max(t.Termin), min(t.Termin))
FROM Letalo p
INNER JOIN Let l ON l.Letalo_idLetalo = p.idLetalo
INNER JOIN Let_Has_Destinacija letD on letD.Let_idLet = l.idLet
INNER JOIN Destinacija d on d.idDestinacija = letD.Destinacija_idDestinacija
INNER JOIN Termin t on t.idTermin = d.Termin_idTermin
INNER JOIN Tip_Destinacije tip on tip.idTip_Destinacije = Tip_Destinacije_idTip_Destinacije WHERE p.Naziv='Falcon FX 3000'
GROUP BY l.idLet;

https://i.imgur.com/hUXZDnQ.png

编辑2 通过使用临时表,我设法对航类时间进行求和,但我必须为此使用 2 个查询,这不是我想要的。

DROP TABLE IF EXISTS tempTime;
CREATE TEMPORARY TABLE tempTime (
SELECT timediff(Max(t.Termin), min(t.Termin)) as FlightTime
    FROM Letalo p
    INNER JOIN Let l ON l.Letalo_idLetalo = p.idLetalo
    INNER JOIN Let_Has_Destinacija letD on letD.Let_idLet = l.idLet
    INNER JOIN Destinacija d on d.idDestinacija = letD.Destinacija_idDestinacija
    INNER JOIN Termin t on t.idTermin = d.Termin_idTermin
    INNER JOIN Tip_Destinacije tip on tip.idTip_Destinacije = Tip_Destinacije_idTip_Destinacije WHERE p.Naziv='Falcon FX 3000'
GROUP BY l.idLet);

SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(FlightTime))) as FlownTime FROM tempTime;
DROP TABLE IF EXISTS tempTime;

https://i.imgur.com/HlPtgHr.png

已接受的答案

SELECT
    `Name`,
    `Destination`, 
    `Type`,
    `Date`, 
    SEC_TO_TIME(SUM(TIME_TO_SEC(`Time_diff`))) as `Tot_Diff`
FROM (
    SELECT
        d.`Ime` as `Name`, 
        letD.`Destinacija_idDestinacija` as `Destination`, 
        l.`idLet` as idFlight,tip.`Tip` as `Type`,
        CAST(t.`Termin` as DATE) as `Date`, 
        timediff(Max(t.`Termin`), min(t.`Termin`)) as `Time_diff`
    FROM Letalo p
    INNER JOIN `Let` l 
        ON l.`Letalo_idLetalo` = p.`idLetalo`
    INNER JOIN `Let_Has_Destinacija` letD 
        on letD.`Let_idLet` = l.`idLet`
    INNER JOIN `Destinacija` d 
        on d.`idDestinacija` = letD.`Destinacija_idDestinacija`
    INNER JOIN `Termin` t 
        on t.`idTermin` = d.`Termin_idTermin`
    INNER JOIN `Tip_Destinacije` tip 
        on tip.`idTip_Destinacije` = `Tip_Destinacije_idTip_Destinacije` 
    WHERE p.Naziv = 'Falcon FX 3000'
    GROUP BY l.idLet
    ) as `main`

最佳答案

我相信这应该会产生您所描述的结果。基本上,它采用您拥有的查询,将其用作子查询 然后对时间差求和。

SELECT
    `Name`,
    `Destination`, 
    `Type`,
    `Date`, 
    SEC_TO_TIME(SUM(TIME_TO_SEC(`Time_diff`))) as `Tot_Diff`
FROM (
    SELECT
        d.`Ime` as `Name`, 
        letD.`Destinacija_idDestinacija` as `Destination`, 
        l.`idLet` as idFlight,tip.`Tip` as `Type`,
        CAST(t.`Termin` as DATE) as `Date`, 
        timediff(Max(t.`Termin`), min(t.`Termin`)) as `Time_diff`
    FROM Letalo p
    INNER JOIN `Let` l 
        ON l.`Letalo_idLetalo` = p.`idLetalo`
    INNER JOIN `Let_Has_Destinacija` letD 
        on letD.`Let_idLet` = l.`idLet`
    INNER JOIN `Destinacija` d 
        on d.`idDestinacija` = letD.`Destinacija_idDestinacija`
    INNER JOIN `Termin` t 
        on t.`idTermin` = d.`Termin_idTermin`
    INNER JOIN `Tip_Destinacije` tip 
        on tip.`idTip_Destinacije` = `Tip_Destinacije_idTip_Destinacije` 
    WHERE p.Naziv = 'Falcon FX 3000'
    GROUP BY l.idLet
    ) as `main`
GROUP BY `Name`,`Destination`,`Type`,`Date`;

关于mysql - 如何减去日期,然后将上一次运算的结果相加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54174746/

相关文章:

mysql - vb.net - Mysql 连接未使用 Sub 例程关闭

添加行时出现 PHP 错误

MySQL Timediff 计算晚上 10 点到早上 6 点之间的小时数

mysql - 如何在 SQL 中使用 IF

php - 在Mysql中更新多行

mysql - 从mysql表中删除N条旧记录

MySQL 选择列值的最大计数

mysql - SQL 中的条件更新

javascript - 提交bar时如何让窗口foo刷新

PHP 分页无法正确运行,在第 6 页停止