【发布时间】:2025-12-12 21:55:01
【问题描述】:
我正在尝试编写一个存储函数,该函数采用正确的 ISO 格式 (yyyy-mm-dd) 并从中减去一定数量的工作日。基于this question here,我已经尝试了接受的答案以及一些不同的答案,但是,他们都只是在说如何编写纯sql,并没有一个例子函数。
我目前拥有的是这样的:
delimiter //
CREATE DEFINER=`root`@`localhost` FUNCTION `WEEKDATE_SUB` (days TINYINT, date_val VARCHAR(16))
RETURNS DATE DETERMINISTIC
BEGIN
DECLARE SUBVAL INT;
DECLARE dow INT;
CASE
WHEN dow=1 THEN SET SUBVAL = (days +(FLOOR((days-0.5)/5)+1)*2 - 1);
WHEN dow=2 THEN SET SUBVAL = (days +(FLOOR((days-0.5)/5)+1)*2);
WHEN dow=3 THEN SET SUBVAL = (days-1 +(FLOOR(((days-1)-0.5)/5)+1)*2 + 1);
WHEN dow=4 THEN SET SUBVAL = (days-2 +(FLOOR(((days-2)-0.5)/5)+1)*2 + 2);
WHEN dow=5 THEN SET SUBVAL = (days-3 +(FLOOR(((days-3)-0.5)/5)+1)*2 + 3);
WHEN dow=6 THEN SET SUBVAL = (days-4 +(FLOOR(((days-4)-0.5)/5)+1)*2 + 4);
WHEN dow=7 THEN SET SUBVAL = (days-5 +(FLOOR(((days-5)-0.5)/5)+1)*2 + 5);
END CASE
RETURN DATE_SUB(date_val, INTERVAL SUBVAL DAY);
END;//
当我尝试添加它时,我得到一个模糊的错误(因为 mysql 喜欢提供): 您的 SQL 语法有错误;查看与您的 MariaDB 服务器版本相对应的手册,了解在 'RETURN DATE_SUB(date_val, INTERVAL SUBVAL DAY); 附近使用的正确语法; END' 在第 14 行
我已经尝试了几种返回的变体,包括尝试为 Date sub 定义一个变量并返回它,但这几乎是相同的错误。
在函数之外,我知道这是可行的,所以看起来我应该能够返回它。
SELECT DATE_SUB("2016-01-01", INTERVAL 4 DAY);
【问题讨论】:
标签: mysql sql sql-function