0

我想在 mysql 5.7 中创建一个函数,它接收两个日期并检查是否存在差异。如果是,则应在第二个日期上增加一天并返回。如果不是,它应该返回日期而不进行任何操作。

不幸的是,每次我想保存函数时都会收到语法错误(使用具有完整权限的 TablePlus)。

我的功能:

CREATE FUNCTION `CheckCreatedAt`(timeStart DATETIME, timeEnd DATETIME) RETURNS datetime
BEGIN 
    DECLARE newDate DATETIME;

    IF TIMESTAMPDIFF(DAY, timeStart, timeEnd) != 0 
    THEN 
        SET newDate = DATE_ADD(timeEnd, INTERVAL 1 DAY);
​   ELSE 
        SET newDate = timeEnd;
    END IF;

    RETURN newDate;
END

错误消息:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在 'ELSE SET newDate = timeEnd; 附近使用的正确语法;万一;

返回新日期;END' 在第 6 行

4

3 回答 3

0

创建存储过程和函数时,您需要更改分隔符以便通知 MySQL 您的代码在哪里结束。

这是使用DELIMITER命令实现的。例如:

DELIMITER $$

将分隔符更改为双美元。

将您的代码修改为以下内容,它将创建您的函数(除非出现其他语法错误):

DELIMITER $$
CREATE FUNCTION `CheckCreatedAt`(timeStart DATETIME, timeEnd DATETIME) RETURNS datetime
BEGIN 
    DECLARE newDate DATETIME;

    IF TIMESTAMPDIFF(DAY, timeStart, timeEnd) != 0 THEN
        SET newDate = DATE_ADD(timeEnd, INTERVAL 1 DAY);
 ​   ELSE 
        SET newDate = timeEnd;
    END IF;

    RETURN newDate;
END$$
DELIMITER ;

这会将分隔符更改为$$,添加$$END函数的语句中,然后将分隔符恢复为;(默认值)。

于 2019-11-15T09:55:47.927 回答
0

Sebastian,你可以进一步简化这个函数。删除IF ELSEand 多个RETURNs 甚至DATE_ADD(and the BEGIN/ELSE):

CREATE FUNCTION `CheckCreatedAt`(
timeStart DATETIME, 
timeEnd DATETIME
) 
RETURNS DATETIME
RETURN IF(TIMESTAMPDIFF(DAY, timeStart, timeEnd) != 0, timeEnd +INTERVAL 1 DAY, timeEnd);
于 2019-11-15T10:08:13.623 回答
0

您可以使用更简单的解决方案来解决此问题。无需在函数内部使用附加变量。您可以直接返回值。

CREATE FUNCTION `CheckCreatedAt`(timeStart DATETIME, timeEnd DATETIME) RETURNS DATETIME
BEGIN
  IF TIMESTAMPDIFF(DAY, timeStart, timeEnd) <> 0 THEN
    RETURN DATE_ADD(timeEnd, INTERVAL 1 DAY);
  ELSE 
    RETURN timeEnd;
  END IF;
END

dbfiddle.uk 上的演示

于 2019-11-15T09:59:35.587 回答