创建一个mysql函数来操纵一个日期

时间:2019-11-15 09:49:13

标签: mysql mysql-function

我想在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 IF;

     

返回newDate; END',位于第6行

3 个答案:

答案 0 :(得分: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语句中,然后将分隔符还原回;(默认值)。 / p>

答案 1 :(得分: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

demo on dbfiddle.uk

答案 2 :(得分:0)

塞巴斯蒂安,您可以进一步简化功能。删除IF ELSE和多个RETURN,甚至删除DATE_ADD(和BEGIN/ELSE):

CREATE FUNCTION `CheckCreatedAt`(
timeStart DATETIME, 
timeEnd DATETIME
) 
RETURNS DATETIME
RETURN IF(TIMESTAMPDIFF(DAY, timeStart, timeEnd) != 0, timeEnd +INTERVAL 1 DAY, timeEnd);