苦苦挣扎,看看我的方式错误(mysql函数)

时间:2011-01-17 14:04:19

标签: sql mysql db2 stored-functions

(请参阅下面的答案以获得解决方案 - 感谢您的反馈)

这可能是非常明显的事情,但我看不出我的SQL有什么问题:

mysql> CREATE FUNCTION start_of_minute(
->     curdate DATE)
->   RETURNS DATE
->   DETERMINISTIC
->   SQL SECURITY INVOKER
->   BEGIN
->     DECLARE sofm DATE;
->     SET sofm = SUBDATE (
->         curdate,
->         INTERVAL SECOND(curdate) SECOND
->       );
->   RETURN sofm;
->   END //
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that 
corresponds to your MySQL server version for the right syntax to use near ');
RETURN sofm;
END' at line 11

以下情况更令人沮丧:

mysql> CREATE FUNCTION start_of_week(
->     curdate DATE,
-> first_day_of_week INTEGER)
->    RETURNS DATE
->    DETERMINISTIC
->    SQL SECURITY INVOKER
->    BEGIN
->       DECLARE sow DATE;
->       SET sow = SUBDATE(
->         curdate,
->         INTERVAL (WEEKDAY(curdate)+(7-first_day_of_week)%7) DAY
->         );
->       RETURN sow;
->    END //
Query OK, 0 rows affected (0.00 sec)

(NB可能有其他方法在各个级别截断日期 - 我当然有兴趣听到它们,我真的想知道我的语法有什么问题 - 不是一个不同的计算开始的方法一段时间)。

是,second() is a valid functionSECOND is a valid interval

TIA

4 个答案:

答案 0 :(得分:1)

我已经考虑过它对这些类型感到不安 - 但是用'DATETIME'类型替换所有'date'类型并没有解决问题 - 结果问题是'SUBDATE'和'(''之间的空格 - 我从来不知道MySQL对这些事情很挑剔!

(我将此标记为asnwer但是我希望我先等几天)

答案 1 :(得分:1)

curdate是一个保留词:

drop function if exists start_of_minute;

delimiter #

create function start_of_minute
(
p_curdate datetime
)
returns datetime
begin
declare sofm datetime;
  set sofm = subdate(p_curdate, interval second(p_curdate) second);
  return sofm;
end#

delimiter;
select now(), start_of_minute(now());

修改

mysql> select curdate();
+------------+
| curdate()  |
+------------+
| 2011-01-17 |
+------------+
1 row in set (0.00 sec)

答案 2 :(得分:0)

问题是因为函数second()接纳time而不是date

也许就像这样

second( cast(curdate as time) )

<强> BUT

由于a given date to seconds的子日期而无意义,并且以日期格式返回(仍为日期)

答案 3 :(得分:0)

您是否应该使用DATETIME数据类型而不是DATE?