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:
- Fungsi PostgreSQL mengembalikan kubus data
- Postgresql mencoba menggunakan format eksekusi dalam suatu fungsi tetapi mendapatkan kesalahan kolom tidak ditemukan saat memberikan format string dalam penggabungan