Hơn nữa, không có gì cho thấy cần phải có PL / pgSQL để bắt đầu. Một SELECT
đơn giản (đã chuẩn bị) tuyên bố có thể làm điều đó. Hoặc một hàm SQL, nếu bạn muốn duy trì nó trong cơ sở dữ liệu. Xem:
Và liên quan:
Xác định giới hạn trên / dưới bao gồm / độc quyền chính xác để tránh kết quả trường hợp góc đáng ngạc nhiên. Khi so sánh timestamp
cột thành một date
, cái sau bị ép buộc vào dấu thời gian biểu thị trường hợp đầu tiên trong ngày:YYYY.MM.DD 00:00:00
.
Truy vấn của bạn cho biết:
measurement_timestamp <= lastDate AND measurement_timestamp >= firstDate
... sẽ bao gồm tất cả firstDate
, nhưng loại trừ tất cả lastDate
ngoại trừ trường hợp đầu tiên (phổ biến) lúc 00:00 . Điển hình không phải những gì bạn muốn. Với công thức của bạn, tôi cho rằng đây là điều bạn thực sự muốn:
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$;
① Điều này bao gồm tất cả lastDate
và hiệu quả. Bạn chỉ có thể thêm / trừ một số nguyên integer
giá trị đến / từ một date
để thêm / bớt ngày
. Truyền rõ ràng tới ::timestamp
là tùy chọn vì ngày tháng sẽ được ép buộc tự động trong biểu thức. Nhưng vì chúng tôi đang cố gắng làm sáng tỏ sự nhầm lẫn ở đây ...
Có liên quan:
Bên cạnh 1:
Không. timestamp
các giá trị không được định dạng, dấu chấm. Chúng chỉ là các giá trị dấu thời gian (được lưu trữ bên trong dưới dạng số micro giây kể từ kỷ nguyên). Hiển thị hoàn toàn tách biệt với giá trị và có thể được điều chỉnh theo một trăm lẻ một cách mà không thay đổi giá trị . Hãy loại bỏ quan niệm sai lầm này để hiểu rõ hơn điều gì đang xảy ra. Xem:
Bên cạnh 2:
Về bản chất quanh co của SQL BETWEEN
:
Bên cạnh 3:
Xem xét các số nhận dạng hợp pháp, viết thường trong Postgres. first_date
thay vì firstDate
. Xem:
Có liên quan:
- Hàm PostgreSQL trả về một khối dữ liệu
- Postgresql đang cố gắng sử dụng định dạng thực thi trong một hàm nhưng nhận được lỗi không tìm thấy cột khi cung cấp định dạng chuỗi trong liên kết