Что сказал Павел.
Более того, ничто не указывает на необходимость PL / pg SQL для начала. Это может сделать простой (подготовленный) оператор SELECT
. Или функцию SQL, если вы хотите сохранить ее в базе данных. См .:
И относительно:
со всеми строками между firstDate
и lastDate
Определите включающую / исключительную верхнюю / нижнюю границу точно , чтобы избежать неожиданных результатов углового регистра. При сравнении столбца timestamp
со столбцом date
последний приводится к метке времени, обозначающей первый экземпляр дня: YYYY.MM.DD 00:00:00
.
В вашем запросе говорится:
measurement_timestamp <= lastDate AND measurement_timestamp >= firstDate
... который будет включать все firstDate
, но исключить все lastDate
, за исключением первого (общего) экземпляра в 00: 00 . Обычно не то, что вам нужно. Учитывая вашу формулировку, я полагаю, это именно то, что вам действительно нужно:
CREATE OR REPLACE FUNCTION get_measurements_by_node_and_date(node_id integer
, firstDate date
, lastDate date)
RETURNS TABLE (measurement_id integer
, node_id integer
, carbon_dioxide float8
, hydrocarbons float8
, temperature float8
, humidity float8
, air_pressure float8
, measurement_timestamp timestamp)
LANGUAGE sql STABLE AS
$func$
SELECT m.id
, m.node_id
, m.carbon_dioxide
, m.hydrocarbons
, m.temperature
, m.humidity
, m.air_pressure
, m.measurement_timestamp -- AS measure -- just documentation
FROM public.measurements_lora m
WHERE m.node_id = _node_id
AND m.measurement_timestamp >= firstDate::timestamp
AND m.measurement_timestamp < (lastDate + 1)::timestamp -- ①!
$func$;
① Это включает в себя все lastDate
, причем эффективно. Вы можете просто добавить / вычесть значение integer
к / из date
, чтобы добавить / вычесть дни . Явное приведение к ::timestamp
необязательно, поскольку дата будет автоматически приведена в выражении. Но поскольку мы пытаемся устранить путаницу здесь ...
Связано:
Помимо 1:
Столбец measurement_timestamp
имеет тип timestamp without time zone
и имеет формат гг-мм-дд чч-мм- ss
Нет. timestamp
значения в формате без , точка. Это просто значения временных меток (хранящиеся внутри как количество микросекунд с начала эпохи). Отображение полностью отделено от значения и может быть отрегулировано сотней и одним способом без изменения значения . Избавьтесь от этого заблуждения, чтобы лучше понять, что происходит. См .:
Помимо 2:
О коварной природе SQL BETWEEN
:
В сторону 3:
Учитывайте допустимые строчные идентификаторы в Postgres. first_date
вместо firstDate
. См .:
Связанные: