我想在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行
答案 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
答案 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);