【问题标题】:Creating a mysql function to manipulate a date创建一个mysql函数来操作日期
【发布时间】:2020-03-11 10:46:33
【问题描述】:

我想在 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 行

【问题讨论】:

  • 我没有看到任何证据表明您正在设置分隔符。dev.mysql.com/doc/refman/8.0/en/stored-programs-defining.html
  • 看起来问题出在 ELSE 行开头的不可见字符。删除它,你应该没问题。
  • 我同意@slaakso 将代码复制/粘贴到一个体面的编辑器中。您有一个损坏,在INVERVAL 1 DAY); 之后和ELSE 之前显示为37?

标签: mysql mysql-function


【解决方案1】:

Sebastian,你可以进一步简化这个函数。删除IF ELSE 和多个RETURNs 甚至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);

【讨论】:

    【解决方案2】:

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

    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

    【讨论】:

      【解决方案3】:

      在创建存储过程和函数时,您需要更改分隔符以便通知 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 语句中,然后将分隔符恢复为;(默认值)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-09
        • 1970-01-01
        • 1970-01-01
        • 2011-01-10
        • 1970-01-01
        • 2010-11-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多