在SQL中创建存储函数以检查一年是否是闰年

时间:2018-03-18 16:17:40

标签: mysql sql

我不确定问题是出在我的逻辑中,还是错误地使用了语法:/

给出错误“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 $$

3 个答案:

答案 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 |
+---------+

演示

http://rextester.com/NQB35930

答案 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'

似乎我认为我正在尝试选择一个列而不是调用一个函数 - 有谁知道为什么会发生这种情况?