Co więcej, nic nie wskazuje na potrzebę PL/pgSQL na początek. Zwykły (przygotowany) SELECT
oświadczenie może to zrobić. Lub funkcję SQL, jeśli chcesz ją utrwalić w bazie danych. Zobacz:
A co do:
Określ inkluzywną/wyłączną górną/dolną granicę precyzyjnie aby uniknąć zaskakujących wyników w przypadku narożnych. Podczas porównywania timestamp
kolumna na date
, ten ostatni jest przypisany do znacznika czasu oznaczającego pierwsze wystąpienie dnia:YYYY.MM.DD 00:00:00
.
Twoje zapytanie brzmi:
measurement_timestamp <= lastDate AND measurement_timestamp >= firstDate
... który zawierałby wszystkie firstDate
, ale wyklucz wszystkie lastDate
z wyjątkiem pierwszego (zwykłego) wystąpienia o godzinie 00:00 . Zazwyczaj nie to, czego chcesz. Biorąc pod uwagę twoje sformułowanie, przypuszczam, że tego naprawdę chcesz:
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$;
① Obejmuje to wszystkie lastDate
i wydajnie. Możesz po prostu dodać/odjąć integer
wartość do / z date
dodać / odjąć dni
. Wyraźne rzutowanie na ::timestamp
jest opcjonalny, ponieważ data zostanie w wyrażeniu wymuszana automatycznie. Ale ponieważ próbujemy wyjaśnić tutaj zamieszanie ...
Powiązane:
Na bok 1:
Nr timestamp
wartości nie sformatowany, kropka. Są to tylko wartości znaczników czasu (wewnętrznie przechowywane jako liczba mikrosekund od epoki). Wyświetlanie jest całkowicie oddzielone od wartości i można je regulować na sto jeden sposobów bez zmiany wartości . Pozbądź się tego błędnego przekonania, aby lepiej zrozumieć, co się dzieje. Zobacz:
Na bok 2:
O przebiegłej naturze SQL BETWEEN
:
Na bok 3:
Rozważ legalne identyfikatory pisane małymi literami w Postgresie. first_date
zamiast firstDate
. Zobacz:
Powiązane:
- Funkcja PostgreSQL zwracająca kostkę danych
- Postgresql próbuje użyć formatu wykonania w funkcji, ale otrzymuje błąd nie znaleziono kolumny podczas podawania formatu ciągu w koalescencji