Làm cách nào tôi có thể lưu trữ giá trị ngày và thời gian với độ chính xác giảm trong loại PostgreSQL và để chúng hoạt động như giá trị ngày và / hoặc thời gian ?
ISO 8601 cho phép giá trị ngày với độ chính xác giảm. '1964', '1964-05', '1964-05-02' đều là các biểu diễn hợp lệ của một giá trị, nhằm tăng độ chính xác. Các loại 'datetime' của Python cũng cho phép các giá trị với độ chính xác giảm theo cách này.
Các loại thời gian riêng của PostgreSQL không cho phép giảm độ chính xác
Trong loại ngày gốc, mọi yếu tố của một ngày phải có mặt hoặc giá trị bị từ chối. Đặt các yếu tố dưới mức chính xác mong muốn thành '00' cũng không thành công.
=> SELECT CAST('1964-05-02' AS DATE);
date
------------
1964-05-02
(1 row)
=> SELECT CAST('1964-05' AS DATE);
ERROR: invalid input syntax for type date: "1964-05"
LINE 1: SELECT CAST('1964-05' AS DATE);
^
=> SELECT CAST('1964' AS DATE);
ERROR: invalid input syntax for type date: "1964"
LINE 1: SELECT CAST('1964' AS DATE);
^
=> SELECT CAST('1964-00-00' AS DATE);
ERROR: date/time field value out of range: "1964-00-00"
LINE 1: SELECT CAST('1964-00-00' AS DATE);
^
HINT: Perhaps you need a different "datestyle" setting.
Hành vi dự kiến cho một ngày và / hoặc loại thời gian chính xác giảm
Có cách nào đơn giản, tiêu chuẩn để hỗ trợ nhập các giá trị ngày ISO 8601 với độ chính xác giảm vào loại ngày và / hoặc loại thời gian PostgreQuery không?
Tạo một loại cho điều này là có thể, nhưng tôi không biết làm thế nào. Tất nhiên, tôi cần các giá trị được kiểm tra phạm vi và xử lý các múi giờ và so sánh hợp lý với các giá trị thời gian khác, tất cả những điều hữu ích khác mà các loại tích hợp thực hiện.
Điều tôi mong đợi là, giống như giá trị '1964-05-02' đề cập đến toàn bộ khoảng thời gian từ 00:00:00 ngày hôm đó cho đến 00:00:00 ngày hôm sau, giá trị giảm độ chính xác sẽ chỉ đơn giản là đại diện cho một khoảng thời gian lớn hơn: '1962-05' đề cập đến toàn bộ khoảng thời gian từ 00:00:00 đầu tháng 5 năm 1962 đến 00:00:00 vào ngày đầu tiên của tháng 6 năm 1962.
Một ví dụ về những gì tôi muốn thấy:
=> SELECT CAST('1964-05-02 00:00' AS TIMESTAMP) = CAST('1964-05-02 00:00:00' AS TIMESTAMP);
?column?
----------
t
(1 row)
=> SELECT CAST('1964-05' AS TIMESTAMP) = CAST('1964-05-02' AS TIMESTAMP);
?column?
----------
t
(1 row)
Hiện tại các cựu cư xử như trên; cái sau phàn nàn về cú pháp đầu vào không hợp lệ của kiểu chữ đối với kiểu dấu thời gian. Trước mắt tôi, cả hai trường hợp giá trị độ chính xác giảm đều hoạt động hợp lý khi so sánh với giá trị độ chính xác tốt hơn.
Ý nghĩa của 1964-05
ISO 8601 bao gồm các giá trị hơn-chính xác 1964-05-02
và 1964-05-02 18:27
và 1964-05-23
. Vì vậy, những người nên so sánh bằng nhau.
1964-05
ISO 8601 bao gồm các giá trị hơn-chính xác 1964-05-02
và 1964-05-02 18:27
và 1964-05-23
. Vì vậy, những người nên so sánh bằng nhau.
true
khi dấu thời gian 'có thể' bằng nhau (cho phép độ chính xác)?