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

Knex âm thầm chuyển đổi dấu thời gian Postgres với múi giờ và trả về thời gian không chính xác

Có thể mọi thứ đang không thành công bởi vì khi bạn đang truy vấn lịch ngày từ cơ sở dữ liệu trong múi giờ nhất định và chuyển đổi hiệu quả loại dấu thời gian thành dấu thời gian không có múi giờ. Trong trường hợp đó, cơ sở dữ liệu sẽ không gửi thông tin đến cơ sở dữ liệu về múi giờ đã trả về thời gian.

Vì vậy, quỳ (hay đúng hơn là trình điều khiển pg mà quỳ đang sử dụng) diễn giải dấu thời gian của bạn là giờ địa phương, phụ thuộc vào thiết lập múi giờ của máy chủ ứng dụng của bạn đang chạy quỳ.

Bạn có thể tìm nạp thời gian giống như UTC và thực hiện chuyển đổi múi giờ trong phía JavaScript với thư viện thời điểm hoặc luxon (IMO sau này tốt hơn cho việc xử lý múi giờ).

Giải pháp khác sẽ là cho trình điều khiển pg biết rằng dấu thời gian và dấu thời gian với các loại múi giờ không được chuyển đổi thành JavaScript Date các đối tượng.

Nó có thể được thực hiện như thế này ( https://github.com/brianc/node-pg- các loại ):

const types = require('pg').types;
const TIMESTAMPTZ_OID = 1184;
const TIMESTAMP_OID = 1114;
types.setTypeParser(TIMESTAMPTZ_OID, val => val);
types.setTypeParser(TIMESTAMP_OID, val => val);

Mã này làm cho tất cả các dấu thời gian được trả về dưới dạng các chuỗi có thể được thêm vào, ví dụ:ở đầu knexfile.js . Các chuỗi được trả về đó sẽ có định dạng chính xác mà chúng được trả về bởi chính máy chủ cơ sở dữ liệu.

CHỈNH SỬA:

Trong mã trong bài đăng gốc, khi dấu thời gian được chuyển đổi thành múi giờ UTC máy chủ cơ sở dữ liệu chuyển đổi timestamp with time zone nhập là timestamp without time zone vì vậy giá trị trả về không có thông tin múi giờ. Để thêm lại thông tin múi giờ, bạn có thể ví dụ thêm +02 vào cuối tem thời gian đã trả về như sau:

select ('2010-01-01T00:00:00.000Z'::timestamptz AT TIME ZONE 'UTC')::text || '+00';

Trả về 2010-01-01 00:00:00+00 tới trình điều khiển mà trình điều khiển pg cũng có thể đọc chính xác.

Điều này sẽ thực hiện hiệu quả điều tương tự như chỉ đặt SET TIME ZONE 'UTC'; trong máy chủ db khi kết nối được tạo và chỉ trả về cột timestamptz trực tiếp:

SET TIME ZONE 'UTC';
select '2010-01-01T00:00:00.000+02:00'::timestamptz;

Nó sẽ trả về 2009-12-31 22:00:00+00 .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để nâng cấp lên PostgreSQL 11 cho Ubuntu 18.04?

  2. Hoạt động CASCADE có điều kiện cho ràng buộc khóa ngoại?

  3. Tham gia bên trong so với thực hiện mệnh đề where in

  4. Làm cách nào để xác định ngày cuối cùng của tháng trước bằng PostgreSQL?

  5. Cách đặt múi giờ trên kết nối postgresql jdbc do flyway tạo?