Chúng ta có thể sử dụng kỹ thuật sau trong PostgreSQL để trả về ngày cuối cùng của một tháng nhất định.
Đây có thể là ngày cuối cùng của tháng hiện tại hoặc ngày cuối cùng của tháng dựa trên ngày mà chúng tôi chỉ định.
Cuối tháng Hiện tại
Dưới đây là một ví dụ trả về ngày cuối cùng của tháng hiện tại:
SELECT (date_trunc('month', now()) + interval '1 month - 1 day');
Kết quả:
2022-04-30 00:00:00+10
Điều này sử dụng date_trunc()
của PostgreSQL , cùng với một số số học ngày tháng để trả về kết quả mà chúng ta muốn. Hàm này cắt ngắn giá trị ngày / giờ thành một độ chính xác được chỉ định.
Trong trường hợp này, tôi sử dụng now()
hàm để trả về ngày hiện tại và 'month'
đối số sửa đổi ngày đó thành đầu tháng. Sau đó, tôi thêm một tháng vào đó (tính đến đầu tháng sau), sau đó trừ đi một ngày kể từ ngày đó để cho chúng tôi cuối tháng trước (là cuối tháng hiện tại).
Chúng tôi có thể chuyển nó thành một giá trị ngày tháng nếu được yêu cầu:
SELECT (date_trunc('month', now()) + interval '1 month - 1 day')::date;
Kết quả:
2022-04-30
Đây là một lần nữa, cùng với ngày thực tế mà tôi đã chạy ví dụ:
SELECT
now()::date AS "Current Date",
(date_trunc('month', now()) + interval '1 month - 1 day')::date AS "End of Month";
Kết quả:
+--------------+--------------+ | Current Date | End of Month | +--------------+--------------+ | 2022-04-09 | 2022-04-30 | +--------------+--------------+
Kết thúc một tháng được chỉ định
Nó không nhất thiết phải là cuối tháng hiện tại. Chúng tôi có thể chỉ định bất kỳ ngày nào và nó sẽ trả về cuối tháng, dựa trên ngày đó.
Ví dụ:
SELECT (date_trunc('month', date '2030-07-14') + interval '1 month - 1 day')::date;
Kết quả:
2030-07-31
Ví dụ về cơ sở dữ liệu
Dưới đây là một ví dụ sử dụng ngày tháng từ cơ sở dữ liệu:
SELECT
rental_date,
(date_trunc('month', rental_date) + interval '1 month - 1 day')::date AS "End of Month"
FROM rental WHERE customer_id = 459 LIMIT 10;
Kết quả:
+---------------------+--------------+ | rental_date | End of Month | +---------------------+--------------+ | 2005-05-24 22:54:33 | 2005-05-31 | | 2005-06-17 02:50:51 | 2005-06-30 | | 2005-06-17 09:38:22 | 2005-06-30 | | 2005-06-17 16:40:33 | 2005-06-30 | | 2005-06-20 02:39:21 | 2005-06-30 | | 2005-06-20 12:35:44 | 2005-06-30 | | 2005-06-20 12:42:00 | 2005-06-30 | | 2005-06-21 02:39:44 | 2005-06-30 | | 2005-07-06 00:22:29 | 2005-07-31 | | 2005-07-08 02:51:23 | 2005-07-31 | +---------------------+--------------+