Vấn đề:
Bạn muốn tìm sự khác biệt giữa hai giá trị ngày / giờ trong cơ sở dữ liệu PostgreSQL.
Ví dụ:
Cơ sở dữ liệu của chúng tôi có một bảng có tên là employment
với dữ liệu trong các cột id
, first_name
, last_name
, start_date
và end_date
:
id | first_name | last_name | start_date | end_date |
---|---|---|---|---|
1 | Barbara | Wilson | 2010-02-01 | 2018-10-30 |
2 | Robert | Anderson | 2001-04-17 | 2011-12-20 |
3 | Steven | Nelson | 2005-06-01 | 2019-09-23 |
Đối với mỗi nhân viên, hãy lấy họ và tên của họ và sự khác biệt giữa ngày bắt đầu và ngày kết thúc công việc của họ. Chúng tôi muốn xem khoảng thời gian theo năm, tháng và ngày.
Giải pháp 1:
Chúng tôi sẽ sử dụng AGE()
hàm số. Đây là truy vấn bạn sẽ viết:
SELECT first_name, last_name, AGE(end_date, start_date) AS employment_interval FROM employment;
Đây là kết quả của truy vấn:
first_name | last_name | Employ_interval |
---|---|---|
Barbara | Wilson | 8 năm 8 tháng 29 ngày |
Robert | Anderson | 10 năm 8 tháng 3 ngày |
Steven | Nelson | 14 năm 3 tháng 22 ngày |
Thảo luận:
Sử dụng PostgreSQL AGE()
hàm để truy xuất khoảng thời gian giữa hai dấu thời gian hoặc ngày tháng. Hàm này nhận hai đối số:đối số đầu tiên là ngày kết thúc và đối số thứ hai là ngày bắt đầu. Trong ví dụ của chúng tôi, chúng tôi sử dụng cột end_date
(tức là khi nhân viên ngừng làm công việc đó) và cột start_date
(khi nhân viên bắt đầu công việc đó).
Sự khác biệt giữa các ngày được trả về dưới dạng khoảng thời gian theo năm, tháng, ngày, giờ, v.v. Truy vấn cho Steven Nelson trả lại thời gian làm việc là khoảng thời gian ‘14 years 3 months 22 days
'; đây là sự khác biệt giữa 2005-06-01, khi anh ấy bắt đầu công việc này và 2019-09-23, khi anh ấy dừng nó.
AGE()
hàm cũng có thể hiển thị sự khác biệt giữa dấu thời gian / ngày hiện tại và đối số đầu tiên. Trong trường hợp này, hàm chỉ có một đối số:
SELECT first_name, last_name, AGE(end_date) AS employment_interval FROM employment;
Truy vấn ở trên hiển thị khoảng thời gian giữa dấu thời gian hiện tại (đối với văn bản này, đó là '2019-09-26') và ngày kết thúc của mỗi nhân viên (cột end_date
).
first_name | last_name | Employ_interval |
---|---|---|
Barbara | Wilson | 10 tháng 27 ngày |
Robert | Anderson | 7 năm 9 tháng 6 ngày |
Steven | Nelson | 3 ngày |
Ba ngày đã trôi qua giữa ngày cuối cùng Steven đi làm và dấu thời gian hiện tại (tại thời điểm viết bài, đó là ngày 29 tháng 9 năm 2019).
Giải pháp 2:
Bạn cũng có thể sử dụng toán tử trừ (‘-’) thay vì AGE()
trừ hai ngày.
Đây là truy vấn bạn sẽ viết:
SELECT first_name, last_name, end_date::DATE – start_date::DATE AS employment_interval FROM employment;
Trong kết quả này, bạn sẽ chỉ thấy sự khác biệt về ngày (không phải năm, tháng và ngày):
first_name | last_name | Employ_interval |
---|---|---|
Barbara | Wilson | 3193 |
Robert | Anderson | 3899 |
Steven | Nelson | 5227 |