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

Nhận thời gian với múi giờ từ thời gian không có múi giờ và tên múi giờ

CẢNH BÁO:Người mới sử dụng PostgreSQL (xem nhận xét về câu hỏi!). Mặc dù vậy, tôi biết một chút về múi giờ, vì vậy tôi biết điều gì có ý nghĩa để hỏi.

Đối với tôi, có vẻ như đây về cơ bản là một tình huống không được hỗ trợ (thật không may) khi nói đến AT TIME ZONE . Nhìn vào TẠI KHU VỰC THỜI GIAN nó cung cấp một bảng trong đó các loại giá trị "đầu vào" chỉ là:

  • dấu thời gian không có múi giờ
  • dấu thời gian với múi giờ
  • thời gian với múi giờ

Chúng tôi đang thiếu một trong những bạn muốn:thời gian không có Múi giờ. Những gì bạn đang hỏi là phần nào hợp lý, mặc dù nó phụ thuộc vào ngày ... vì các múi giờ khác nhau có thể có hiệu số khác nhau tùy thuộc vào ngày. Ví dụ:12:00:00 Châu Âu / Luân Đôn có thể nghĩa là 12:00:00 UTC hoặc có thể có nghĩa là 11:00:00 UTC, tùy thuộc vào đó là mùa đông hay mùa hè.

Trên hệ thống của tôi, sau khi đặt múi giờ hệ thống thành America / Regina, truy vấn

SELECT ('2011-11-22T12:00:00'::TIMESTAMP WITHOUT TIME ZONE) 
                               AT TIME ZONE 'America/Vancouver'

cho tôi 2011-11-22 14:00:00-06 kết quả là. Đó không phải là lý tưởng , nhưng ít nhất nó cũng đưa ra thời điểm tức thì (tôi nghĩ vậy). Tôi tin rằng nếu bạn tìm nạp nó bằng thư viện khách - hoặc so sánh nó với một TIMESTAMP WITH TIME ZONE khác - bạn sẽ nhận được kết quả phù hợp. Đó chỉ là chuyển đổi văn bản sau đó sử dụng hệ thống múi giờ cho đầu ra.

Điều đó có đủ tốt cho bạn không? Bạn có thể thay đổi SCHEDULES.time của mình không trường trở thành TIMESTAMP WITHOUT TIME ZONE hoặc (tại thời điểm truy vấn) kết hợp thời gian từ trường với một ngày để tạo dấu thời gian không có múi giờ?

CHỈNH SỬA:Nếu bạn hài lòng với "ngày hiện tại" thì có vẻ như giống như bạn có thể chỉ cần thay đổi truy vấn của mình thành:

SELECT (current_date + SCHEDULES.time) AT TIME ZONE USERS.tz
from SCHEDULES JOIN USERS on USERS.ID=SCHEDULES.USERID

Tất nhiên, hệ thống hiện tại ngày có thể không giống với ngày hiện tại theo múi giờ địa phương . Tôi nghĩ rằng điều này sẽ khắc phục phần đó ...

SELECT ((current_timestamp AT TIME ZONE USERS.tz)::DATE + schedules.time)
       AT TIME ZONE USERS.tz
from SCHEDULES JOIN USERS on USERS.ID=SCHEDULES.USERID

Nói cách khác:

  • Bắt kịp hiện tại
  • Tính ngày / giờ địa phương theo múi giờ của người dùng
  • Lấy ngày đó
  • Thêm thời gian lịch biểu vào ngày đó để nhận được TIMESTAMP WITHOUT TIME ZONE
  • Sử dụng AT TIME ZONE để áp dụng múi giờ cho ngày / giờ địa phương đó

Tôi chắc rằng có một cách tốt hơn, nhưng tôi nghĩ rằng nó có ý nghĩa.

Bạn nên biết rằng trong một số trường hợp, điều này có thể không thành công:

  • Bạn muốn kết quả là gì vào thời điểm 01:30 vào một ngày khi đồng hồ chạy từ 01:00 đến 02:00, do đó, 01:30 hoàn toàn không xảy ra?
  • Bạn muốn kết quả là bao nhiêu cho thời điểm từ 01:30 vào một ngày khi đồng hồ quay ngược từ 02:00 đến 01:00, do đó 01:30 xảy ra hai lần?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kiểm tra xem loại do người dùng xác định đã tồn tại trong PostgreSQL hay chưa

  2. Làm cách nào để phân tích cú pháp mảng JSON trong postgresql?

  3. PostgreSQL:UPDATE ngụ ý di chuyển qua các phân vùng

  4. Mô phỏng TẠO CƠ SỞ DỮ LIỆU NẾU KHÔNG TỒN TẠI cho PostgreSQL?

  5. postgresql không thể mở truy vấn INSERT dưới dạng con trỏ