8.5. Dạng Date/Time (Ngày tháng/Thời gian)
8.5.1. Đầu vào ngày tháng/thời gian
Đầu vào ngày tháng và thời gian được chấp nhận trong hầu hết bất kỳ định dạng hợp lý nào, bao gồm cả ISO 8601, tương thích SQL, POSTGRES truyền thống và các dịnh dạng khác. Đối với một số định dạng, trật tự ngày, tháng và năm trong đầu vào ngày tháng là không xác định và có sự hỗ trợ cho việc xác định trật tự được mong đợi của các trường đó. Thiết lập tham số DateStyle về MDY để chọn tháng-ngày-năm, DMY để chọn ngày-tháng-năm, hoặc YDM để chọn năm-tháng-ngày.
PostgreSQL mềm dẻo hơn trong việc điều khiển đầu vào ngày tháng/thời gian so với tiêu chuẩn SQL yêu cầu. Xem Phụ lục B để có các qui tắc chính xác phân tích cú pháp đầu vào ngày tháng/thời gian và cho các trường văn bản được thừa nhận bao gồm tháng, ngày của tuần và vùng thời gian.
Nhớ rằng bất kỳ đầu vào hằng ngày tháng hoặc thời gian nào cũng cần phải được đưa vào các nháy đơn, giống như các chuỗi văn bản. Hãy tham chiếu tới Phần 4.1.2.7 để có thêm thông tin. SQL yêu cầu cú pháp sau:
type [ (p) ] ’value’
trong đó p là một đặc tả độ chính xác tùy chọn đưa ra số các chữ số thập phân trong trường giây seconds. Độ chính xác có thể được chỉ định cho các dạng time, timestamp và interval. Các giá trị được phép được nhắc tới ở trên. Nếu không có độ chính xác nào được chỉ định trong một đặc tả
hằng, thì nó mặc định cho độ chính xác của giá trị hằng đó.
8.5.1.1. Ngày tháng
Bảng 8-10 chỉ một số đầu vào có khả năng cho dạng ngày tháng date. Bảng 8-10. Đầu vào ngày tháng
Ví dụ Mô tả
1999-01-08 ISO 8601; Ngày 8 tháng 1 ở mọi chế độ (định dạng được khuyến cáo) January 8, 1999 mập mờ trong mọi chế độ đầu vào dạng ngày tháng datestyle
1/8/1999 Ngày 8 tháng 1 theo chế độ MDY; ngày 1 tháng 8 theo chế độ DMY 1/18/1999 Ngày 18 tháng 1 theo chế độ MDY; bị từ chối trong các chế độ khác
01/02/03 Ngày 2 tháng 1 năm 2003 theo chế độ MDY, ngày 1 tháng 2 năm 2003 theo chế độ DMY; ngày 3 tháng 2 năm 2001 theo chế độ YMD
1999-Jan-08 Ngày 8 tháng 1 trong bất kỳ chế độ nào Jan-08-1999 Ngày 8 tháng 1 trong bất kỳ chế độ nào 08-Jan-1999 Ngày 8 tháng 1 trong bất kỳ chế độ nào 99-Jan-08 Ngày 8 tháng 1 theo YMD, còn lại thì lỗi
08-Jan-99 Ngày 8 tháng 1, ngoại trừ có lỗi theo chế độ YMD Jan-08-99 Ngày 8 tháng 1, ngoại trừ có lỗi theo chế độ YMD
19990108 ISO 8601; ngày 8 tháng 1 năm 1999 theo bất kỳ chế độ nào 990108 ISO 8601; ngày 8 tháng 1 năm 1999 theo bất kỳ chế độ nào 1999.008 năm và ngày của năm
J2451187 ngày theo lịch Julian January 8, 99 BC Năm 99 BC
8.5.1.2. Thời gian
Các dạng thời gian của ngày (time-of-day) là time [ (p) ] without time zone và time [ (p) ] with time zone. time là tương đương một mình với time without time zone.
Đầu vào hợp lệ cho các dạng đó bao gồm thời gian của ngày theo sau là một vùng thời gian tùy chọn. (Xem Bảng 8-11 và Bảng 8-12). Nếu một vùng thời gian được chỉ định ở đầu vào cho time without time zone, thì nó âm thầm được bỏ qua. Bạn cũng có thể chỉ định một ngày tháng nhưng nó sẽ bị bỏ qua, ngoại trừ khi bạn sử dụng một tên vùng thời gian có liên quan tới một qui tắc tiết kiệm ánh sáng ban ngày như America/New_York. Trong trường hợp này việc chỉ định ngày tháng được yêu cầu để xác định liệu tiêu chuẩn hoặc thời gian tiết kiệm ánh sáng ban ngày có được áp dụng hay không. Sự bù trừ vùng thời gian phù hợp được ghi nhận trong giá trị time with time zone.
Bảng 8-11. Đầu vào thời gian
Ví dụ Mô tả
04:05:06.789 ISO 8601
04:05:06 ISO 8601
04:05 ISO 8601
040506 ISO 8601
04:05 AM hệt như 04:05; AM không ảnh hưởng tới giá trị
04:05 PM hệt như 16:05; giờ đầu vào phải là <= 12
04:05:06.789-8 ISO 8601
04:05:06-08:00 ISO 8601
04:05-08:00 ISO 8601
040506-08 ISO 8601
04:05:06 PST vùng thời gian được chỉ định viết tắt
2003-04-12 04:05:06 America/New_York vùng thời gian được tên đầy đủ chỉ định
Bảng 8-12. Đầu vào vùng thời gian
Ví dụ Mô tả
PST Viết tắt (cho thời gian tiêu chuẩn Thái Bình dương) America/New_York Tên đầy đủ của vùng thời gian
PST8PDT Đặc tả vùng thời gian kiểu POSIX
-8:00 ISO-8601 phần bù cho PST
-800 ISO-8601 phần bù cho PST
-8 ISO-8601 phần bù cho PST
zulu Viết tắt kiểu quân sự cho UTC
z Dạng ngắn gọn của zulu
Tham khảo Phần 8.5.3 để có thêm thông tin về cách chỉ định các vùng thời gian.
8.5.1.3. Dấu thời gian
Đầu vào hợp lệ cho các dạng dấu thời gian cấu tạo từ sự ghép một ngày tháng và một thời gian, theo sau là một vùng thời gian tùy chọn, theo sau là một lựa chọn AD hoặc BC. (Như một lựa chọn, AD/BC có thể xuất hiện trước vùng thời gian, nhưng đây không là trật tự được ưu tiên). Vì thế:
1999-01-08 04:05:06
và
1999-01-08 04:05:06 -8:00
là các giá trị hợp lệ, chúng tuân theo tiêu chuẩn ISO 8601. Hơn nữa, định dạng chung:
January 8 04:05:06 1999 PST
được hỗ trợ.
Tiêu chuẩn SQL phân biệt các hằng timestamp without time zone và timestamp with time zone bằng sự hiện diện của một biểu tượng dấu “+” hoặc “-” và bù trừ vùng thời gian sau thời gian đó. Vì thế, theo tiêu chuẩn,
TIMESTAMP ’2004-10-19 10:23:54’
là một timestamp without time zone, trong khi
TIMESTAMP ’2004-10-19 10:23:54+02’
là một timestamp with time zone. PostgreSQL không bao giờ kiểm tra nội dung của một chuỗi hằng trước khi xác định dạng của nó, và vì thế sẽ đối xử với cả 2 ở trên như là timestamp without time zone. Để đảm bảo rằng một hằng được đối xử như là timestamp with time zone, hãy trao cho nó dạng rõ ràng đúng:
TIMESTAMP WITH TIME ZONE ’2004-10-19 10:23:54+02’
Trong một hằng mà từng được xác định sẽ là timestamp without time zone, PostgreSQL sẽ âm thầm bỏ qua bất kỳ chỉ định vùng thời gian nào. Đó là, giá trị kết quả được dẫn xuất từ các trường ngày tháng/thời gian ở giá trị đầu vào, và không được tinh chỉnh cho vùng thời gian.
Đối với timestamp with time zone, giá trị ban đầu được lưu trữ luôn là theo Thời gian Được điều phối Vạn năng - UTC (Universal Coordinated Time), theo truyền thống được biết tới như là Giờ mặt trời – GMT (Greenwich Mean Time). Một giá trị đầu vào có một vùng thời gian rõ ràng được chỉ định được chuyển đổi thành UTC bằng việc sử dụng bù trừ phù hợp cho vùng thời gian đó. Nếu không vùng nào được công bố trong chuỗi đầu vào, thì được giả thiết sẽ là trong vùng thời gian được tham số vùng thời gian (timezone) của hệ thống chỉ định, và được chuyển đổi thành UTC bằng việc sử dụng bù trừ cho vùng timezone.
Khi một giá trị timestamp with time zone là đầu ra, nó luôn được chuyển đổi từ UTC sang vùng
timezone hiện hành, và được hiển thị như là thời gian địa phương theo vùng đó. Để xem thời gian trong vùng thời gian khác, hoặc thay đổi timezone hoặc sử dụng cấu trúc AT TIME ZONE (xem Phần 9.9.3).
Những biến đổi giữa timestamp without time zone và timestamp with time zone thường giả thiết rằng giá trị timestamp without time zone sẽ được lấy hoặc được đưa ra như là timezone thời gian địa phương. Một vùng thời gian khác có thể được chỉ định cho sự biến đổi đó bằng việc sử dụng AT TIME ZONE.
8.5.1.4. Giá trị đặc biệt
PostgreSQL hỗ trợ vài giá trị đầu vào ngày tháng/thời gian đặc biệt vì sự tiện lợi, như được nêu ở Bảng 8-13. Giá trị infinity và -infinity được trình bày đặc biệt bên trong hệ thống và sẽ được hiển thị không thay đổi; nhưng những giá trị khác đơn giản là những tốc ký sẽ được biến đổi thành các giá trị ngày tháng/thời gian thông thường khi đọc. (Đặc biệt, now và các chuỗi có liên quan được
chuyển đổi thành một giá trị thời gian đặc biệt ngay khi chúng được đọc). Tất cả các giá trị đó cần phải được đưa vào các nháy đơn khi được sử dụng như những hằng số trong các lệnh SQL.
Bảng 8-13. Các đầu vào ngày tháng/thời gian đặc biệt
Chuỗi đầu vào Các dạng hợp lệ Mô tả
epoch date , timestamp 1970-01-01 00:00:00+00 (thời gian 0 theo hệ thống Unix) infinity date , timestamp chậm hơn tất cả các dấu thời gian khác
-infinity date , timestamp sớm hơn tất cả các dấu thời gian khác now date , time , timestamp thời gian bắt đầu giao dịch hiện hành today date , timestamp nửa đêm hôm nay
tomorrow date , timestamp nửa đêm ngày mai yesterday date , timestamp nửa đêm hôm qua
allballs time 00:00:00.00 UTC
Các hàm tương thích SQL sau đây cũng có thể được sử dụng để giành được giá trị thời gian hiện hành đối với dạng dữ liệu tương ứng: CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, LOCALTIME, LOCALTIMESTAMP. 4 dạng sau chấp nhận một đặc tả độ chính xác phần giây tùy chọn.
(Xem Phần 9.9.4). Lưu ý chúng là các hàm SQL và không được thừa nhận trong các chuỗi đầu vào dữ liệu.