Trong bài viết này, chúng ta sẽ khám phá ngày Postgres, các kiểu dữ liệu ngày tháng khác nhau, cách sử dụng và chức năng.
Dấu thời gian và ngày tháng giúp ích cho việc phân tích dữ liệu và lưu trữ dữ liệu để kiểm tra thời điểm một sự kiện thực sự diễn ra. Ví dụ:khi bạn có đơn đặt hàng mua và bán, thu nhập hàng tháng hoặc hàng quý và hơn thế nữa. Định dạng ngày tháng khác nhau giữa các quốc gia, do đó, nó có thể là một nhiệm vụ phức tạp đối với những người mới sử dụng quản lý cơ sở dữ liệu và đang làm việc với các cột ngày tháng. Định dạng hoặc kiểu dữ liệu của cột ngày phải luôn khớp với đầu vào của người dùng. Ngoài ra, bạn nên chuyển đổi hiển thị định dạng ngày theo yêu cầu của người dùng.
Postgres có nhiều loại dữ liệu được hỗ trợ. Trước khi tiếp tục, tôi khuyên bạn nên tham khảo Khám phá các loại dữ liệu Postgres khác nhau để hiểu chi tiết hơn về chúng.
Kiểu dữ liệu Postgres DATE
Postgres sử dụng kiểu dữ liệu DATE để lưu trữ các ngày khác nhau ở định dạng YYYY-MM-DD. Nó sử dụng 4 byte để lưu trữ giá trị ngày tháng trong một cột.
- Ngày thấp nhất:4713 trước Công nguyên
- Ngày cao nhất:5874897 trước Công nguyên
- Định dạng ngày:YYYY-MM-DD (Ví dụ:2021-01-01)
Bạn có thể thiết kế bảng Postgres với cột DATE và sử dụng từ khóa DEFAULT CURRENT_DATE để sử dụng ngày hệ thống hiện tại làm giá trị mặc định trong cột này.
CREATE TABLE SalesOrders ( Order_id serial PRIMARY KEY, Orderdetails VARCHAR (255) NOT NULL, OrderDate DATE NOT NULL DEFAULT CURRENT_DATE ); INSERT INTO SalesOrders (Orderdetails) VALUES('Sample Order for customer ABC'); SELECT * FROM SalesOrders;
Như được hiển thị bên dưới, SQL tự động chèn giá trị cho cột [Ngày đặt hàng] với ngày hệ thống hiện tại ở định dạng YYYY-MM-DD.
Hàm Postgres DATE
Chúng ta thường cần sửa đổi định dạng ngày tháng hoặc thực hiện các phép tính trên các giá trị hiện có được lưu trữ trong bảng Postgres. Ví dụ:ở Ấn Độ, định dạng ngày thông thường là DD-MM-YYYY. Do đó, khi một người dùng Ấn Độ xem dữ liệu, chúng tôi có thể sẽ muốn anh ta xem dữ liệu ở định dạng mà anh ta quen thuộc nhất. Trong trường hợp này, Hàm SQL đóng một vai trò quan trọng.
Hàm TO_CHAR ()
Hàm này hữu ích để đưa ra giá trị ngày Postgres ở định dạng được chỉ định. Nó chấp nhận hai tham số sau.
- Ngày nhập:Đây là ngày bạn muốn chuyển đổi thành một định dạng cụ thể.
- Định dạng ngày:Đây là nơi bạn chỉ định định dạng ngày mới.
Truy vấn sau chuyển đổi các giá trị ngày hiện có được lưu trữ trong bảng [SalesOrders] thành định dạng DD-MM-YYYY.
SELECT Orderdetails,OrderDate as ExistingDateformat, to_char(OrderDate,'DD-MM-YYYY') As NewDateFormat FROM SalesOrders;
Các giá trị được hỗ trợ trong hàm to_char () như được hiển thị bên dưới.
YYYY | Năm có bốn chữ số |
YYY | Ba chữ số cuối cùng của năm |
YY | Hai chữ số cuối của năm |
THÁNG | Tên tháng bằng chữ in hoa |
Tháng | Tên tháng viết hoa chữ cái đầu tiên |
tháng | Tên tháng bằng chữ thường |
MON / Mon / mon | Viết tắt tháng bằng tất cả chữ cái viết hoa, chữ cái đầu tiên viết hoa và tất cả chữ cái viết thường, tương ứng |
MM | Số tháng (01-12) |
DAY / Ngày / ngày | Tên ngày viết hoa, viết hoa chữ cái đầu tiên và tất cả các chữ cái viết thường |
DDD | Ngày trong năm (001 đến 366) |
DD | Ngày trong tháng (01 đến 31) |
D | Ngày trong tuần (Chủ nhật (1) đến Thứ bảy (7)) |
W | Tuần trong tháng |
WW | Tuần trong năm |
Một vài ví dụ về các định dạng ngày tháng khác nhau được chỉ định trong SQL sau.
SELECT Orderdetails,OrderDate as ExistingDateformat, to_char(OrderDate,'DD-MM-YYYY') As DDMMYYYY, to_char(OrderDate,'DD-MM-YY') As DDMMYY, to_char(OrderDate,'DD.MM.YY') As "DD.MM.YY", to_char(OrderDate,'MM/DD/YYYY') As "MM/DD/YYYY", to_char(OrderDate,'DAY MM/DD/YYYY') As "MM/DD/YYYY", to_char(OrderDate,'DDD MM/DD/YYYY') As "DDD MM/DD/YYYY" FROM SalesOrders
Hàm Now ()
Hàm Now () trả về dấu thời gian của hệ thống hiện tại (ngày và giờ).
Bạn có thể chỉ định dấu hai chấm kép (::) để truyền giá trị DATETIME thành giá trị DATE.
Bạn có thể kết hợp hàm TO_CHAR () và hàm Now () để chuyển đổi dấu thời gian hiện tại thành định dạng được chỉ định.
SELECT TO_CHAR(NOW() :: DATE, 'dd-mm-yyyy');
Toán tử trừ và khoảng cách
Bạn có thể sử dụng toán tử trừ (-) để tính toán sự khác biệt giữa hai ngày. Ví dụ:truy vấn bên dưới trả về khoảng thời gian giữa dấu thời gian hiện tại và [Ngày đặt hàng] từ bảng Đơn đặt hàng.
SELECT Orderdate,now() as currentdate, now()-Orderdate as Interval FROM SalesOrders where order_id=2;
Bạn cũng có thể chỉ định khoảng thời gian để trả về ngày sau một khoảng thời gian được chỉ định. Ví dụ:truy vấn SQL dưới đây cung cấp các giá trị sau.
- Đối với ngày trong tương lai, hãy chỉ định giá trị khoảng thời gian cách dấu thời gian hiện tại 2 giờ: now () + khoảng thời gian ‘2 giờ’
- Đối với ngày trong tương lai, hãy chỉ định giá trị khoảng thời gian 1 ngày từ dấu thời gian hiện tại: bây giờ () + khoảng thời gian ‘1 ngày’
- Đối với ngày đã qua, chỉ định giá trị khoảng thời gian một năm tính từ dấu thời gian hiện tại: Hiện tại () - khoảng thời gian ‘1 năm’
- Tính toán ngày đã qua một năm từ giá trị được lưu trữ trong cột [Ngày đặt hàng]: ngày đặt hàng - khoảng thời gian ‘1 năm’
SELECT (NOW() + interval '2 hour') AS twohourslater, (NOW() + interval '1 day') AS Onedaylater, (NOW() - interval '1 year') AS OneYearBefore, (Orderdate- interval '1 year') as Orderdatedifference from salesorders;
Hàm AGE ()
Hàm AGE () trả về sự khác biệt ngày trong năm, tháng và ngày. Bạn có thể sử dụng hàm này để tính tuổi của một người.
Hàm này chấp nhận hai tham số ngày và trừ giá trị ngày đầu tiên cho giá trị thứ hai.
Nếu bạn đảo ngược các giá trị trong tập lệnh hàm trên, nó sẽ trả về giá trị âm.
Trong một ví dụ khác, giả sử ai đó có ngày sinh 1990-07-01. Do đó, tuổi của một người có thể được tính như dưới đây.
SELECT current_date, AGE(timestamp '1990-07-01') as EmpAge;
Hàm EXTRACT ()
Hàm Extract () trả về ngày, tuần, tháng, năm và quý từ giá trị ngày được chỉ định.
Trích xuất một năm
SELECT EXTRACT(YEAR FROM TIMESTAMP '2021-06-28 10:30:15') as year;
Trích xuất một tháng
SELECT EXTRACT(Month FROM TIMESTAMP '2021-06-28 10:30:15') as Month;
Trích xuất một phần tư
SELECT EXTRACT(QUARTER FROM TIMESTAMP '2021-06-28 10:30:15') as QUARTER;
Trích ngày trong tuần
SELECT EXTRACT(DOW FROM TIMESTAMP '2021-06-28 10:30:15') as DOW ;
Trích ngày trong năm
SELECT EXTRACT(DOY FROM TIMESTAMP '2021-06-28 10:30:15') as DOY ;
Bạn cũng có thể sử dụng hàm EXTRACT () kết hợp với INTERVAL. Ví dụ, dưới đây chúng tôi chỉ định khoảng thời gian là 7 năm 9 tháng 20 ngày 09 giờ 12 phút và 13 giây. Hàm trích xuất trả về các giá trị riêng lẻ.
SELECT EXTRACT(YEAR FROM INTERVAL '7 years 9 months 20 days 09 hours 12 minutes 13 second' ), EXTRACT(Month FROM INTERVAL '7 years 9 months 20 days 09 hours 12 minutes 13 second' ), EXTRACT(Day FROM INTERVAL '7 years 9 months 20 days 09 hours 12 minutes 13 second' ), EXTRACT(hour FROM INTERVAL '7 years 9 months 20 days 09 hours 12 minutes 13 second' ), EXTRACT(Minute FROM INTERVAL '7 years 9 months 20 days 09 hours 12 minutes 13 second' ); ;
TẠI TIMEZONE
Đôi khi, bạn cần chuyển đổi dấu thời gian thành một múi giờ khác. Ví dụ:bạn có thể lưu trữ các giá trị ngày trong UTC (Bộ điều phối thời gian toàn cầu) và chuyển đổi múi giờ theo yêu cầu.
SELECT * FROM pg_timezone_names;
Để kiểm tra múi giờ hiện tại, hãy sử dụng SHOW TIMEZONE như hình dưới đây.
Bạn có thể chọn giá trị múi giờ bắt buộc từ pg_timezone_names và sử dụng AT TIME ZONE để nhận kết quả theo múi giờ đã chỉ định.
SELECT '2021-06-28 07:09:19'::timestamp AT TIME ZONE 'America/Chicago';
Tương tự, chúng ta có thể nhận được các kết quả đầu ra múi giờ khác nhau bằng cách sử dụng AT TIME ZONE.
SELECT '2021-06-28 07:09:19'::timestamp AT TIME ZONE 'America/New_York';
SELECT '2021-06-28 07:09:19'::timestamp AT TIME ZONE 'Asia/Qatar';
SELECT '2021-06-28 07:09:19'::timestamp AT TIME ZONE 'Europe/Istanbul';
Tóm tắt
Các kiểu ngày postgres rất cần thiết và có giá trị khi lưu trữ ngày tháng và dấu thời gian trong hầu hết các bảng của cơ sở dữ liệu quan hệ. Bạn cần chúng cho các mục đích khác nhau như chèn đơn đặt hàng hoặc khi cập nhật dấu thời gian, đơn đặt hàng mua và bán, chi tiết sự kiện, thông tin khách hàng và nhân viên, v.v. Bạn có thể sử dụng nhiều hàm Postgres để chuyển đổi loại ngày thành múi giờ, định dạng và thông tin cụ thể được yêu cầu nhằm đơn giản hóa việc trích xuất và phân tích dữ liệu của bạn.