因此,我为一家航空公司创建了一个数据库,该数据库目前有3个表.表1:航班,表2:客户,表3:预订,我想创建一个函数,在函数中返回从预订到航班日期的剩余时间.不幸的是,在我运行它之后,什么也没有返回.有什么建议吗?

DROP DATABASE if exists Chartered_Airlines;
CREATE DATABASE Chartered_Airlines;
USE Chartered_Airlines;

CREATE TABLE FLIGHTS(FLIGHT_NO INT(5)   NOT NULL, DEPARTURE VARCHAR(15), ARRIVAL    VARCHAR(15), TYPEFL VARCHAR(15), SEATS INT(4) NOT NULL, FREE_SEATS INT(4), FLIGHT_DATE DATE,
    PRIMARY KEY(FLIGHT_NO));
CREATE TABLE CUSTOMERS(CL_NO    INT(5)  NOT NULL, LAST_NAME VARCHAR(15) NOT NULL, FIRST_NAME VARCHAR(15) NOT NULL, CITIZENSHIP VARCHAR(15) NOT NULL, B_DATE DATE,
    PRIMARY KEY(CL_NO));
CREATE TABLE RESERVATIONS(RES_NO INT(5) NOT NULL, CL_NO INT(5)  NOT NULL, FLIGHT_NO INT(5), COST FLOAT(15), RES_DATE DATE,
    PRIMARY KEY(RES_NO),
    FOREIGN KEY(FLIGHT_NO) REFERENCES FLIGHTS(FLIGHT_NO),
    FOREIGN KEY(CL_NO) REFERENCES CUSTOMERS(CL_NO));

SHOW TABLES;

INSERT INTO FLIGHTS VALUES(10,'ATHENS','LONDON','EXTERNAL',310,34, '2023/10/04');
INSERT INTO FLIGHTS VALUES(20,'ATHENS','MYKONOS','INTERNAL',100,5, '2022/12/12');
INSERT INTO FLIGHTS VALUES(30,'ATHENS','PARIS','EXTERNAL',256,16, '2022/09/07');
 
INSERT INTO CUSTOMERS VALUES(5472,'ALEKSANDRAKIS','GEORGIOS','GREECE','1989/01/01');
INSERT INTO CUSTOMERS VALUES(1354,'STAVROU','ANTREAS','GREECE','1977/07/07');
INSERT INTO CUSTOMERS VALUES(6598,'AMALFIO','ROBERTO','ITALY','1995/05/02');
INSERT INTO CUSTOMERS VALUES(1953,'EUSTATHIOU','NIKOS','GREECE','2001/06/03');
INSERT INTO CUSTOMERS VALUES(1387,'STAKAS','VASILLIS','GREECE','1990/01/07');

INSERT INTO RESERVATIONS VALUES(3174,5472,10,6482, '2020/03/02');
INSERT INTO RESERVATIONS VALUES(3143,1354,10,6482, '2021/05/09');
INSERT INTO RESERVATIONS VALUES(1286,6598,20,662, '2022/10/12');
INSERT INTO RESERVATIONS VALUES(3275,1953,20,662, '2022/09/08');
INSERT INTO RESERVATIONS VALUES(7654,1387,30,264, '2022/09/06');


SELECT * FROM FLIGHTS;
SELECT * FROM CUSTOMERS;
SELECT * FROM RESERVATIONS;

DESC FLIGHTS;
DESC RESERVATIONS;
DESC CUSTOMERS;


DELIMITER //
CREATE FUNCTION TIME_LEFT(RES_NO INT) RETURNS INT
DETERMINISTIC
BEGIN
    DECLARE TIME_LEFT INT DEFAULT 0;
    SELECT TIMESTAMPDIFF(MONTH,RESERVATIONS.RES_DATE,FLIGHTS.FLIGHT_DATE) INTO TIME_LEFT FROM RESERVATIONS 
    WHERE RES_NO = RES_NO AND RESERVATIONS.FLIGHT_NO = FLIGHTS.FLIGHT_NO ;
    RETURN TIME_LEFT;

END;
//

SELECT TIME_LEFT(3143);

我以为它会返回预订日期和航班日期之间的日期差异.

推荐答案

我认为您需要在SELECT语句中包括表Flights,并指定输入中的res_no与保留中的res_no之间的区别,例如,

CREATE FUNCTION TIME_LEFT(RES_NO_in INT) RETURNS INT
DETERMINISTIC
BEGIN
  DECLARE TIME_LEFT INT DEFAULT 0;
  SELECT TIMESTAMPDIFF(MONTH,RESERVATIONS.RES_DATE,FLIGHTS.FLIGHT_DATE) INTO TIME_LEFT
  FROM RESERVATIONS, FLIGHTS
  WHERE RESERVATIONS.RES_NO = RES_NO_in AND RESERVATIONS.FLIGHT_NO = FLIGHTS.FLIGHT_NO;
  RETURN TIME_LEFT;
END;

CREATE FUNCTION TIME_LEFT(RES_NO_in INT) RETURNS INT
DETERMINISTIC
BEGIN
  DECLARE TIME_LEFT INT DEFAULT 0;
  SELECT TIMESTAMPDIFF(MONTH,RESERVATIONS.RES_DATE,FLIGHTS.FLIGHT_DATE) INTO TIME_LEFT
  FROM RESERVATIONS
    INNER JOIN FLIGHTS ON RESERVATIONS.FLIGHT_NO = FLIGHTS.FLIGHT_NO
  WHERE RESERVATIONS.RES_NO = RES_NO_in;
  RETURN TIME_LEFT;
END;

Sql相关问答推荐

如何根据SQL中的列条件获取下一个时间戳?

在请求结束之前,PostgreSQL不会考虑使用中的删除

检索上一个星期四和上一个星期三

使用generate_series()时,LEFT联接缺少日期/间隔

同一表的Oracle SQL更新(含YTD合计)

按用户和时间列出的SQL Group考勤列表

此过程如何在不引用传递的参数值的情况下执行工作?

违反了完整性约束-值存在时找不到父键

如何使用最后一个非 NULL 值在 PostgreSQL 列中填充 NULL 值

如何 for each id创建长度等于id长度的不同日期序列?

如何对 jsonb 中的字段执行求和,然后使用结果过滤查询的输出

SQL Server:时态表并在运行时添加计算列

SQL的左连接在多对多关系情况下使用

自动生成计算频率的列

查询以查找今天和昨天的数据之间的差异以及伪列

如何在 SQL Server 中将 -13422.8450 舍入到 -13422.84

如何防止 SQL 中的负收入值并将其重新分配到接下来的月份?

查找距上一条记录大于或等于 30 天的记录

Select 随机行,使得列子组的组合是唯一的

Amazon Redshift - 子计划的哈希表不存在