PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak napisać funkcję w plpgsql, która porównuje datę ze znacznikiem czasu bez strefy czasowej?

Co powiedział Paweł.

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:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sformatuj wartość podwójnej precyzji w Postgresql

  2. pgAdmin 4 wer. 1.5 - brak komunikatów o błędach

  3. Jak wygenerować instrukcję create table sql dla istniejącej tabeli w postgreSQL?

  4. PG gem nie instaluje się w aplikacji Rails:Gem::Ext::BuildError:BŁĄD:Nie udało się zbudować natywnego rozszerzenia gem

  5. Długi czas połączenia z Azure Postgres