PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Cách tìm khoảng thời gian giữa hai ngày trong PostgreSQL

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_dateend_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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL:Làm thế nào để truyền các tham số từ dòng lệnh?

  2. Tùy chọn chuyển đổi dự phòng cụm cơ sở dữ liệu đầy đủ đa đám mây cho PostgreSQL

  3. So sánh các tùy chọn cơ sở dữ liệu đám mây cho PostgreSQL

  4. Nhận id chèn cuối cùng sau khi chèn đã chuẩn bị sẵn với PDO

  5. Tài nguyên đào tạo &học tập hàng đầu về PostgreSQL