função armazenada no MySQL não gosta do utilizador fornecido datas?
-
22-07-2019 - |
Pergunta
Eu tenho uma função armazenada em 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
Bastante básico, tem um id, data de início e uma data final e retorna a contagem de logins para esse intervalo de datas. Sempre que eu executá-lo eu recebo um 0 para trás. A menos que eu removi a seção da data da cláusula onde. Em seguida, ele retorna a um número real. Ou se eu apenas colocar manualmente as datas na função armazenada funciona ... Então não é uma questão de datas, mas só quando eu estou fornecendo as datas através da lista de parâmetros que não gosta.
Todos os pensamentos sobre o que faria com que isso aconteça? O fato de que eu posso simplesmente colocar manualmente as datas na função armazenados e funciona realmente me incomoda. Não é como muita coisa está acontecendo aqui que poderia atrapalhar isso estou meio perdido como que a próxima tentativa.
Além disso, existe uma maneira de depuração armazenadas funções / procedimentos. Eu estou apenas começando a 0 para trás, mas há uma maneira para me depurar isso para tentar descobrir o que pode estar acontecendo?
Solução
Meu primeiro palpite é que você está fornecendo datas em um formato que o MySQL não reconhece. MySQL é bastante exigente sobre o formato de literais de data. Ele quer AAAA-MM-DD, YY-MM-DD, AAAAMMDD, ou AAMMDD (você também pode usar qualquer outro caractere de pontuação no lugar dos traços). Consulte O DATETIME, data e tipos TIMESTAMP para mais detalhes .
Você também pode converter mais formatos de data para o formato MySQL aceita com o STR_TO_DATE () função .
Em relação depuração de procedimentos armazenados e funções armazenadas, você sempre pode definir uma variável definida pelo usuário com o prefixo @
, e esta variável se torna globalmente disponível após o retorno de função armazenados. Como um efeito colateral. Assim você pode usar este para se ajustar informações de diagnóstico durante a execução de sua função armazenada, e, em seguida, verificá-la depois.