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

Dấu thời gian sớm nhất được hỗ trợ trong PostgreSQL

Sách hướng dẫn nêu các giá trị như:

  • Giá trị thấp:4713 TCN
  • Giá trị cao:294276 SCN

với cảnh báo, như Chris đã lưu ý, rằng -infinity cũng được hỗ trợ.

Xem ghi chú sau đó trong cùng một trang trong sách hướng dẫn; điều trên chỉ đúng nếu bạn đang sử dụng dấu thời gian số nguyên , là mặc định trong tất cả các phiên bản gần đây của PostgreSQL. Nếu nghi ngờ:

SHOW integer_datetimes;

sẽ nói với bạn. Nếu bạn đang sử dụng ngày giờ dấu chấm động thay vào đó, bạn sẽ nhận được phạm vi lớn hơn và độ chính xác thấp hơn (phi tuyến tính). Bất kỳ nỗ lực nào để tìm ra mức tối thiểu theo chương trình đều phải đối phó với hạn chế đó.

PostgreSQL không chỉ cho phép bạn truyền 0 đến một dấu thời gian để có được dấu thời gian tối thiểu có thể, điều này cũng không có ý nghĩa gì nếu bạn đang sử dụng lịch ngày dấu phẩy động. Bạn có thể sử dụng hàm chuyển đổi ngày julian, nhưng điều này cung cấp cho bạn kỷ nguyên không phải là thời gian tối thiểu :

postgres=> select to_timestamp(0);
      to_timestamp      
------------------------
 1970-01-01 08:00:00+08
(1 row)

bởi vì nó chấp nhận các giá trị âm. Bạn sẽ nghĩ rằng đặt nó maxint phủ định sẽ hiệu quả, nhưng kết quả thật đáng ngạc nhiên đến mức tôi tự hỏi liệu chúng ta có một lỗi nào đó đang rình rập ở đây không:

postgres=> select to_timestamp(-922337203685477);
          to_timestamp           
---------------------------------
 294247-01-10 12:00:54.775808+08
(1 row)

postgres=> select to_timestamp(-92233720368547);
          to_timestamp           
---------------------------------
 294247-01-10 12:00:54.775808+08
(1 row)

postgres=> select to_timestamp(-9223372036854);
         to_timestamp         
------------------------------
 294247-01-10 12:00:55.552+08
(1 row)

postgres=> select to_timestamp(-922337203685);
ERROR:  timestamp out of range
postgres=> select to_timestamp(-92233720368);
          to_timestamp           
---------------------------------
 0954-03-26 09:50:36+07:43:24 BC
(1 row)

postgres=> select to_timestamp(-9223372036);
         to_timestamp         
------------------------------
 1677-09-21 07:56:08+07:43:24
(1 row)

(Có lẽ liên quan đến thực tế là to_timestamp chiếm gấp đôi, mặc dù dấu thời gian được lưu trữ dưới dạng số nguyên ngày nay?).

Tôi nghĩ có thể là khôn ngoan nhất nếu chỉ để phạm vi dấu thời gian là bất kỳ dấu thời gian nào mà bạn không gặp lỗi. Rốt cuộc, phạm vi dấu thời gian hợp lệ không liên tục:

postgres=> SELECT TIMESTAMP '2000-02-29';
      timestamp      
---------------------
 2000-02-29 00:00:00
(1 row)

postgres=> SELECT TIMESTAMP '2001-02-29';
ERROR:  date/time field value out of range: "2001-02-29"
LINE 1: SELECT TIMESTAMP '2001-02-29';

vì vậy bạn không thể cho rằng chỉ vì một giá trị nằm giữa hai dấu thời gian hợp lệ nên giá trị đó tự hợp lệ.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chỉ mục GIN của PostgreSQL chậm hơn GIST cho pg_trgm?

  2. Làm cách nào để tôi có thể ngăn chặn / phát hiện luồng dưới trong phép tính Postgresql sử dụng EXP ()

  3. Doctrine - Thêm dấu thời gian mặc định vào thực thể như NOW ()

  4. Không thể kết nối với postgres từ máy chủ từ xa

  5. 3 cách để kiểm tra kiểu dữ liệu của cột trong PostgreSQL