Cách dùng hàm date_part để trừ 2 khoảng thời gian trong PostgreSQL

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
YearsDATEDIFF(yy, start, end)DATE_PART(‘year’, end) – DATE_PART(‘year’, start)
MonthsDATEDIFF(mm, start, end)years_diff * 12 + (DATE_PART(‘month’, end) – DATE_PART(‘month’, start))
DaysDATEDIFF(dd, start, end)DATE_PART(‘day’, end – start)
WeeksDATEDIFF(wk, start, end)TRUNC(DATE_PART(‘day’, end – start)/7)
HoursDATEDIFF(hh, start, end)days_diff * 24 + DATE_PART(‘hour’, end – start )
MinutesDATEDIFF(mi, start, end)hours_diff * 60 + DATE_PART(‘minute’, end – start )
SecondsDATEDIFF(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/

Leave a Reply

Your email address will not be published.