我不确定问题是出在我的逻辑中,还是错误地使用了语法:/
给出错误“ERROR 1064(42000):您的SQL语法中有错误;请查看与您的MariaDB服务器版本对应的手册,以便在'SET Answer =”闰年“附近使用正确的语法; ELSE SET答案=“不是闰年”;“
DELIMITER $$
DROP FUNCTION IF EXISTS f_Leap_Year;
CREATE FUNCTION f_Leap_Year(ENTER_YEAR INT)
RETURNS VARCHAR(30)
BEGIN
DECLARE Answer VARCHAR(30);
DECLARE ENTER_YEAR INTEGER;
If (Enter_Year % 400 = 0
OR (Enter_Year % 4 =0 and not Enter_Year % 100 = 0))
SET Answer = "Leap Year";
ELSE SET Answer = "Not a Leap Year";
RETURN Answer;
END $$
答案 0 :(得分:4)
这是一项冗余功能。这就是为什么......
SET @year = '2016';
SELECT CASE WHEN DATE_FORMAT(CONCAT(@year,'-03-01') - INTERVAL 1 DAY,'%d') = 29 THEN 1 ELSE 0 END is_leap;
+---------+
| is_leap |
+---------+
| 1 |
+---------+
答案 1 :(得分:1)
这个答案是基于Strawberry的回答。
也可以不使用- INTERVAL 1 DAY
,因为DATE_FORMAT('2015-02-29', '%d')
在无效日期时会生成NULL值。
<强>查询强>
SET @year = '2015';
SELECT CASE WHEN DATE_FORMAT(CONCAT(@year, '-02-29'), "%d") IS NOT NULL THEN 1 ELSE 0 END is_leap;
SET @year = '2016';
SELECT CASE WHEN DATE_FORMAT(CONCAT(@year, '-02-29'), "%d") IS NOT NULL THEN 1 ELSE 0 END is_leap;
<强>结果
+---------+
| is_leap |
+---------+
| 0 |
+---------+
+---------+
| is_leap |
+---------+
| 1 |
+---------+
演示
答案 2 :(得分:0)
感谢您的回复。事实上,我认为问题在于我在每个THEN
语句中遗漏了SET
,而DETERMINISTIC
;以下代码有效。
DROP FUNCTION IF EXISTS LeapYear;
CREATE FUNCTION LeapYear(EnterYear INT) RETURNS VARCHAR(30)
DETERMINISTIC
BEGIN
DECLARE answer VARCHAR(35);
IF (Enter_Year % 400 = 0
OR (Enter_Year % 4 =0 and not Enter_Year % 100 = 0)) THEN
SET answer = 'Leap year';
ELSE
SET answer = 'Not a leap year';
END IF;
RETURN (answer);
END
但现在我遇到了一个新问题 - 虽然我可以创建该函数并且它在数据库中显示为现有,但当我尝试使用它时,我收到以下错误:
MariaDB [my_dbname]> select leapyear(1976)$$
ERROR 1054 (42S22): Unknown column 'Enter_Year' in 'field list'
似乎我认为我正在尝试选择一个列而不是调用一个函数 - 有谁知道为什么会发生这种情况?