2009-08-05 3 views
3

У меня есть хранимая функция в MySQL:Сохраненная функция в MySQL не соответствует датам, предоставленным пользователем?

CREATE FUNCTION `login_count`(o INT, start_date DATE, end_date DATE) RETURNS INT 
READS SQL DATA 
BEGIN 
DECLARE total_count INT; 
SELECT COUNT(*) INTO total_count FROM logins as l WHERE `order_id` = o && modified BETWEEN start_date AND end_date; 
RETURN total_count; 
END 

Довольно основные, принимает идентификатор, дата начала и дату окончания и возвращает количество логинов для этого диапазона дат. Всякий раз, когда я запускаю его, я получаю обратно 0. Если я не удалял раздел даты предложения where. Затем он возвращает фактическое число. ИЛИ если я просто вручную помещаю даты в хранимую функцию, это работает ... Так что это не проблема дат, но только когда я даю даты в списке параметров, это не нравится.

Любые мысли относительно того, что могло бы случиться так? Тот факт, что я могу просто вручную помещать даты в хранимую функцию, и он работает, действительно меня пугает. Это не похоже на то, что здесь происходит много, что может испортиться, поэтому я как бы потерялся, как попробовать.

Также существует способ отладки хранимых функций/процедур. Я просто получаю 0 назад, но есть ли способ отладить это, чтобы попытаться выяснить, что может произойти?

ответ

2

Мое первое предположение заключается в том, что вы поставляете даты в формате, который не распознает MySQL. MySQL довольно придирчив к формату литератур даты. Он хочет использовать YYYY-MM-DD, YY-MM-DD, YYYYMMDD или YYMMDD (вы также можете использовать любой символ пунктуации вместо тире). См. The DATETIME, DATE, and TIMESTAMP Types для более подробной информации.

Вы также можете конвертировать больше форматов даты в формат, принятый в MySQL, с помощью функции STR_TO_DATE().

Что касается отладки хранимых процедур и хранимых функций, вы всегда можете установить пользовательскую переменную с префиксом @, и эта переменная станет доступной по всему миру после возврата сохраненной функции. Как побочный эффект. Таким образом, вы можете использовать это для установки диагностической информации при запуске сохраненной функции, а затем проверить ее позже.

+0

Спасибо за подсказку. Я попробую это, чтобы отладить это. Что касается даты, вот как я ее называю. SELECT login_count (3250, '2009-05-31', '2009-06-31'); Какой правильный формат, но кто знает, что происходит. Я попробую @ вещь и опубликую больше информации. –

+0

Хех, ваш комментарий заставил меня вернуться и поиграть с датами. Я все время использовал YYYY-MM-31 в конце месяца, и он всегда работал. Но почему-то в этом случае ему не понравилось 31 день в июне :) –

+0

Хех! Хорошо, я рад, если мое предложение помогло вам заметить настоящую проблему. –