1

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

这可能很明显,但我看不出我的 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)

(注意,可能还有其他方法可以在各个级别截断日期 - 我当然有兴趣了解它们,我真的很想知道我的语法有什么问题 - 不是计算句点开始的不同方法) .

是的,second() 是一个有效的函数,而SECOND 是一个有效的区间

TIA

4

4 回答 4

1

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

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

于 2011-01-17T14:41:35.900 回答
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)
于 2011-01-17T14:43:02.520 回答
0

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

也许像这样

second( cast(curdate as time) )

由于 的子日期而没有意义a given date to seconds,并以日期格式返回(仍然是日期)

于 2011-01-17T14:20:54.597 回答
0

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

于 2011-01-17T14:21:08.180 回答