Параметр данных хранимой процедуры PostgreSQL - PullRequest
4 голосов
/ 13 мая 2011

У меня есть следующая хранимая процедура, которая возвращает 0 результатов, но если выполнить запрос сам по себе, это приведет к большому количеству результатов.Чего мне не хватает.

CREATE OR REPLACE FUNCTION countStatistics(baselineDate Date) RETURNS int AS $$
DECLARE
    qty int;
BEGIN
    SELECT COUNT(*) INTO qty FROM statistics WHERE time_stamp = baselineDate;
    RETURN qty;
END;
$$ LANGUAGE plpgsql;

--Execute the function
SELECT countStatistics('2015-01-01 01:00:00') as qty;

вернуть 0 результатов

SELECT COUNT(*) FROM statistics WHERE time_stamp = '2015-01-01 01:00:00';

вернуть 100+ результатов

1 Ответ

7 голосов
/ 13 мая 2011

Вы объявляете свой параметр baselineDate как date:

CREATE OR REPLACE FUNCTION countStatistics(baselineDate Date)

, но используете его как timestamp:

SELECT COUNT(*) INTO qty FROM statistics WHERE time_stamp = baselineDate;

Вы получаетенеявное приведение, поэтому countStatistics('2015-01-01 01:00:00') на самом деле выполнит этот SQL:

SELECT COUNT(*) INTO qty FROM statistics WHERE time_stamp = '2015-01-01';

и после того, как date неявно приведёт обратно к timestamp, оно фактически будет таким:

SELECT COUNT(*) INTO qty FROM statistics WHERE time_stamp = '2015-01-01 00:00:00';

Попробуйте изменить объявление функции, чтобы использовать timestamp:

CREATE OR REPLACE FUNCTION countStatistics(baselineDate timestamp)
...