Hàm DATE_PART () trích xuất một trường con từ một giá trị ngày hoặc giờ. Phần sau minh họa hàm DATE_PART ():
DATE_PART(field,source)
field là một định danh xác định trường nào sẽ trích xuất từ nguồn. Các giá trị của trường phải nằm trong danh sách các giá trị được phép được đề cập bên dưới:
- century
- decade
- year
- month
- day
- hour
- minute
- second
- microseconds
- milliseconds
- dow
- doy
- epoch
- isodow
- isoyear
- timezone
- timezone_hour
- timezone_minute
source là một biểu thức thời gian đánh giá TIMESTAMP, TIME hoặc INTERVAL. Nếu source đánh giá là DATE, hàm sẽ cast thành TIMESTAMP.
Trừ 2 khoảng thời gian trong PostgreSQL
PostgreSQL không cung cấp hàm DATEDIFF tương tự như SQL Server DATEDIFF, nhưng bạn có thể sử dụng các biểu thức hoặc UDF khác nhau để có được kết quả tương tự.
results.
SQL Server | PostgreSQL | |
Years | DATEDIFF(yy, start, end) | DATE_PART(‘year’, end) – DATE_PART(‘year’, start) |
Months | DATEDIFF(mm, start, end) | years_diff * 12 + (DATE_PART(‘month’, end) – DATE_PART(‘month’, start)) |
Days | DATEDIFF(dd, start, end) | DATE_PART(‘day’, end – start) |
Weeks | DATEDIFF(wk, start, end) | TRUNC(DATE_PART(‘day’, end – start)/7) |
Hours | DATEDIFF(hh, start, end) | days_diff * 24 + DATE_PART(‘hour’, end – start ) |
Minutes | DATEDIFF(mi, start, end) | hours_diff * 60 + DATE_PART(‘minute’, end – start ) |
Seconds | DATEDIFF(ss, start, end) | minutes_diff * 60 + DATE_PART(‘minute’, end – start ) |
Ví dụ minh họa
-- Difference between Oct 02, 2011 and Jan 01, 2012 in years
SELECT DATE_PART('year', '2012-01-01'::date) - DATE_PART('year', '2011-10-02'::date);
-- Result: 1
-- Difference between Oct 02, 2011 and Jan 01, 2012 in months
SELECT (DATE_PART('year', '2012-01-01'::date) - DATE_PART('year', '2011-10-02'::date)) * 12 +
(DATE_PART('month', '2012-01-01'::date) - DATE_PART('month', '2011-10-02'::date));
-- Result: 3
- Difference between Dec 29, 2011 23:00 and Dec 31, 2011 01:00 in days
SELECT DATE_PART('day', '2011-12-31 01:00:00'::timestamp - '2011-12-29 23:00:00'::timestamp);
-- Result: 1
-- Difference between Dec 22, 2011 and Dec 31, 2011 in weeks
SELECT TRUNC(DATE_PART('day', '2011-12-31'::timestamp - '2011-12-22'::timestamp)/7);
-- Result: 1
-- Difference between Dec 30, 2011 08:55 and Dec 30, 2011 9:05 in hours
SELECT DATE_PART('day', '2011-12-30 08:55'::timestamp - '2011-12-30 09:05'::timestamp) * 24 +
DATE_PART('hour', '2011-12-30 08:55'::timestamp - '2011-12-30 09:05'::timestamp);
-- Result: 0
-- Difference between Dec 30, 2011 08:54:55 and Dec 30, 2011 08:56:10 in minutes
SELECT (DATE_PART('day', '2011-12-30 08:56:10'::timestamp - '2011-12-30 08:54:55'::timestamp) * 24 +
DATE_PART('hour', '2011-12-30 08:56:10'::timestamp - '2011-12-30 08:54:55'::timestamp)) * 60 +
DATE_PART('minute', '2011-12-30 08:56:10'::timestamp - '2011-12-30 08:54:55'::timestamp);
-- Result: 1
-- Time only
SELECT DATE_PART('hour', '08:56:10'::time - '08:54:55'::time) * 60 +
DATE_PART('minute', '08:56:10'::time - '08:54:55'::time);
-- Result: 1
-- Difference between Dec 30, 2011 08:54:55 and Dec 30, 2011 08:56:10 in seconds
SELECT ((DATE_PART('day', '2011-12-30 08:56:10'::timestamp - '2011-12-30 08:54:55'::timestamp) * 24 +
DATE_PART('hour', '2011-12-30 08:56:10'::timestamp - '2011-12-30 08:54:55'::timestamp)) * 60 +
DATE_PART('minute', '2011-12-30 08:56:10'::timestamp - '2011-12-30 08:54:55'::timestamp)) * 60 +
DATE_PART('second', '2011-12-30 08:56:10'::timestamp - '2011-12-30 08:54:55'::timestamp);
-- Result: 75
-- Time only
SELECT (DATE_PART('hour', '08:56:10'::time - '08:54:55'::time) * 60 +
DATE_PART('minute', '08:56:10'::time - '08:54:55'::time)) * 60 +
DATE_PART('second', '08:56:10'::time - '08:54:55'::time);
-- Result: 75
nguồn:
https://www.sqlines.com/postgresql/how-to/datediff
https://www.postgresqltutorial.com/postgresql-date_part/