1

次のSQLコードを作成しました:

DELIMITER $$

CREATE FUNCTION flighttime (p_arrival(DATE), p_departure(DATE))
RETURNS CHAR(50)
BEGIN
    DECLARE v_hour INT;
    DECLARE v_minute INT;
    DECLARE v_htext CHAR(10);
    DECLARE v_mtext CHAR(10);
    DECLARE v_flighttime CHAR(50);
    DATEDIFF(minute, p_departure, p_arrival) AS v_minute;
    v_hour = v_minute/60;
    v_minute = v_minute-(v_hour*60);

    IF v_hour<2 AND v_minute<2 THEN SET v_htext=' hour and ' AND v_mtext=' minute';
    ELSEIF v_hour<2 AND v_minute>1 THEN SET v_htext=' hour and ' AND v_mtext=' minutes';
    ELSEIF v_hour>1 AND v_minute<2 THEN SET v_htext=' hours and ' AND v_mtext=' minute';
    ELSE SET v_htext=' hours and ' AND v_mtext=' minutes';

    SET v_flighttime = CONCAT(v_hour, v_mtext, v_minute, v_mtext);
    RETURN v_flighttime;
END

$$
DELIMITER;

修正:

DELIMITER $$
CREATE FUNCTION flighttime (p_arrival DATETIME, p_departure DATETIME)
    RETURNS CHAR(70)
BEGIN
    DECLARE v_hour INT;
    DECLARE v_minute INT;
    DECLARE v_htext CHAR(15);
    DECLARE v_mtext CHAR(15);
    DECLARE v_flighttime CHAR(70);
    SET v_hour = HOUR(TIMEDIFF(p_departure, p_arrival));
    SET v_minute = MINUTE(TIMEDIFF(p_departure, p_arrival));
    IF v_hour<2 AND v_minute<2 THEN 
        SET v_htext = ' hour and ';
        SET v_mtext=' minute';
    ELSEIF v_hour<2 AND v_minute>1 THEN 
        SET v_htext=' hour and '; 
        SET v_mtext=' minutes';
    ELSEIF v_hour>1 AND v_minute<2 THEN 
        SET v_htext=' hours and ';
        SET v_mtext=' minute';
    ELSE 
        SET v_htext=' hours and ';
        SET v_mtext=' minutes';
    END IF;

    SET v_flighttime = CONCAT(v_hour, v_htext, v_minute, v_mtext);

    RETURN v_flighttime;
END $$
DELIMITER ;

しかし、phpMyAdmin 3.5.2.2 で次のようなエラー メッセージが表示されます。

1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(DATE), p_departure(DATE)) RETURNS CHAR(50) BEGIN DECLARE v_hour INT; DECLAR' at line 1

以前に 1064 個のエラーが発生しましたが、バック ティック ` または通常のティック ' を使用してほとんどのエラーを解決できました。残念ながら、今回は役に立ちませんでした。

この関数の目的は、2 つの日付の差を計算し、この差を時間と分で返すことです。単数形と複数形の区別も。

誰かがこの問題を解決する方法や手がかりを持っていれば幸いです。

助けてくれてありがとう。これで解決しました(DATEをDATETIMEに変更する必要もありました:))

4

1 に答える 1

2

宣言が無効です。そのはず

CREATE FUNCTION flighttime (p_arrival DATE, p_departure DATE)
....

値の設定が無効なため、すぐに別のエラーが発生します。使用する必要がありますSET

SET v_minute = DATEDIFF(minute, p_departure, p_arrival);
SET v_hour = v_minute/60;
SET v_minute = v_minute-(v_hour*60);

完全なコード、

DELIMITER $$
CREATE FUNCTION flighttime (p_arrival DATE, p_departure DATE)
RETURNS CHAR(50)
BEGIN
    DECLARE v_hour INT;
    DECLARE v_minute INT;
    DECLARE v_htext CHAR(10);
    DECLARE v_mtext CHAR(10);
    DECLARE v_flighttime CHAR(50);
    SET v_minute = DATEDIFF(minute, p_departure, p_arrival);
    SET v_hour = v_minute/60;
    SET v_minute = v_minute-(v_hour*60);

    IF v_hour<2 AND v_minute<2 THEN 
        SET v_htext = ' hour and ';
        SET v_mtext=' minute';
    ELSEIF v_hour<2 AND v_minute>1 THEN 
        SET v_htext=' hour and '; 
        SET v_mtext=' minutes';
    ELSEIF v_hour>1 AND v_minute<2 THEN 
        SET v_htext=' hours and ';
        SET v_mtext=' minute';
    ELSE 
        SET v_htext=' hours and ';
        SET v_mtext=' minutes';
    END IF;

    SET v_flighttime = CONCAT(v_hour, v_mtext, v_minute, v_mtext);

    RETURN v_flighttime;
END $$
DELIMITER ;
于 2013-01-11T16:07:34.330 に答える