Изо всех сил, чтобы увидеть ошибку моих путей (функция mysql) - PullRequest
1 голос
/ 17 января 2011

(см. Мой ответ ниже для решения - спасибо за отзыв)

Возможно, это что-то действительно очевидное, но я не вижу, что не так с моим 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 () - допустимая функция , а SECOND - допустимый интервал .

ТИА

Ответы [ 4 ]

1 голос
/ 17 января 2011

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());

EDIT

mysql> select curdate();
+------------+
| curdate()  |
+------------+
| 2011-01-17 |
+------------+
1 row in set (0.00 sec)
1 голос
/ 17 января 2011

Я уже считал, что это расстраивается из-за типов - однако замена всех типов 'date' на типы 'DATETIME' не решила проблему - оказывается, проблема была в пробеле между 'SUBDATE' и '('- Я никогда не знал, что MySQL суетится из-за таких вещей!

(я бы отметил это как ответ, но ТАК хочет, чтобы я сначала подождал пару дней)

0 голосов
/ 17 января 2011

Не следует ли использовать тип данных DATETIME вместо DATE?

0 голосов
/ 17 января 2011

Проблема в том, что функция second() принимает time вместо date

, может быть, вот так

second( cast(curdate as time) )

НО

не имеет смысла из-за дополнительной даты для a given date to seconds и возврата в формате даты (который все еще является датой)

...