(请参阅下面的答案以获得解决方案 - 感谢您的反馈)
这可能是非常明显的事情,但我看不出我的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 function和SECOND is a valid interval。
TIA
答案 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?