PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana cara menulis fungsi di plpgsql yang membandingkan tanggal dengan stempel waktu tanpa zona waktu?

Apa yang dikatakan Pavel.

Terlebih lagi, tidak ada yang menunjukkan perlunya PL/pgSQL untuk memulai. SELECT plain polos (disiapkan) pernyataan bisa melakukannya. Atau fungsi SQL, jika Anda ingin mempertahankannya di database. Lihat:

Dan tentang:

Definisikan batas atas / bawah inklusif / eksklusif dengan tepat untuk menghindari hasil kasus sudut yang mengejutkan. Saat membandingkan timestamp kolom ke date , yang terakhir dipaksa ke stempel waktu yang menandakan contoh pertama hari itu:YYYY.MM.DD 00:00:00 .

Permintaan Anda mengatakan:

measurement_timestamp <= lastDate AND measurement_timestamp >= firstDate

... yang akan mencakup semua firstDate , tetapi kecualikan semua lastDate kecuali untuk instance (umum) pertama pada pukul 00:00 . Biasanya tidak seperti yang Anda inginkan. Mengingat formulasi Anda, saya kira inilah yang benar-benar Anda inginkan:

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$;

Ini termasuk semua lastDate , dan efisien. Anda cukup menambah / mengurangi integer nilai ke / dari date untuk menambah / mengurangi hari . Pemeran eksplisit ke ::timestamp adalah opsional karena tanggal akan dipaksakan dalam ekspresi secara otomatis. Tapi karena kami mencoba menjernihkan kebingungan di sini ...

Terkait:

Selain 1:

Tidak. timestamp nilainya tidak diformat, titik. Itu hanya nilai stempel waktu (disimpan secara internal sebagai jumlah mikrodetik sejak zaman). Tampilan benar-benar terpisah dari nilai dan dapat disesuaikan dalam seratus satu cara tanpa mengubah nilai . Singkirkan kesalahpahaman ini untuk lebih memahami apa yang terjadi. Lihat:

Selain 2:

Tentang sifat licik SQL BETWEEN :

Selain 3:

Pertimbangkan pengidentifikasi huruf kecil yang legal di Postgres. first_date bukannya firstDate . Lihat:

Terkait:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tidak dapat menjatuhkan tabel temp di fungsi Postgres:digunakan oleh kueri aktif di sesi ini

  2. Haruskah saya disconnect() jika saya menggunakan Apache::DBI's connect_cached()?

  3. PostgreSQL json_array_elements dalam klausa FROM - mengapa ini tidak bergabung dengan cartesian?

  4. Penyedia OleDB/ODBC yang bagus untuk PostgreSQL

  5. Memetakan array dengan Hibernate