PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Làm cách nào để viết một hàm trong plpgsql so sánh ngày với dấu thời gian không có múi giờ?

Pavel đã nói gì.

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:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle DBMS_LOB.WRITEAPPEND thành Chuyển đổi Postgres

  2. Rails 4 custom 404 gây ra lỗi kết nối postgresql trên Heroku

  3. Cách hoạt động của to_char () trong PostgreSQL

  4. Làm thế nào để trả về kết quả của một SELECT bên trong một hàm trong PostgreSQL?

  5. Nhập các byte thô dưới dạng các byte thô trong R