К сожалению PostgreSQL не поддерживает DATEDIFF
. В противном случае вы могли бы использовать это для захвата year(s)
, month(s)
, day(s)
, hour(s)
, minute(s) ago
+ just now
, используя этот код:
-- SQL Server --
SELECT
CASE WHEN (DATEDIFF(yy, now(), time_field)) > 1 THEN CONCAT((DATEDIFF(yy, now(), time_field), ' years ago'))
WHEN (DATEDIFF(yy, now(), time_field)) = 1 THEN CONCAT((DATEDIFF(yy, now(), time_field), ' year ago'))
WHEN (DATEDIFF(mm, now(), time_field)) > 1 THEN CONCAT((DATEDIFF(mm, now(), time_field), ' months ago'))
WHEN (DATEDIFF(mm, now(), time_field)) = 1 THEN CONCAT((DATEDIFF(mm, now(), time_field), ' month ago'))
WHEN (DATEDIFF(dd, now(), time_field)) > 1 THEN CONCAT((DATEDIFF(dd, now(), time_field), ' days ago'))
WHEN (DATEDIFF(dd, now(), time_field)) = 1 THEN CONCAT((DATEDIFF(dd, now(), time_field), ' day ago'))
WHEN (DATEDIFF(hh, now(), time_field)) > 1 THEN CONCAT((DATEDIFF(hh, now(), time_field), ' hours ago'))
WHEN (DATEDIFF(hh, now(), time_field)) = 1 THEN CONCAT((DATEDIFF(hh, now(), time_field), ' hour ago'))
WHEN (DATEDIFF(mi, now(), time_field)) > 1 THEN CONCAT((DATEDIFF(mi, now(), time_field), ' minutes ago'))
WHEN (DATEDIFF(mi, now(), time_field)) = 1 THEN CONCAT((DATEDIFF(mi, now(), time_field), ' minute ago'))
ELSE 'just now'
END AS time_ago
FROM your_table
Однако, поскольку вы используете PostgreSQL, вам придется использовать некоторый код, который выглядит не так красиво или лаконично:
-- PostgreSQL --
SELECT
CASE
-- year(s)
WHEN (DATE_PART('year', now()) - DATE_PART('year', time_field)) > 1
THEN CONCAT((DATE_PART('year', now()) - DATE_PART('year', time_field)), ' years ago')
WHEN (DATE_PART('year', now()) - DATE_PART('year', time_field)) = 1
THEN CONCAT((DATE_PART('year', now()) - DATE_PART('year', time_field)), ' year ago')
-- month(s)
WHEN (((DATE_PART('year', now()) - DATE_PART('year', time_field)) * 12) + (DATE_PART('month', now(), time_field))) > 1
THEN CONCAT((((DATE_PART('year', now()) - DATE_PART('year', time_field)) * 12) + (DATE_PART('month', now(), time_field))) ' months ago')
WHEN (((DATE_PART('year', now()) - DATE_PART('year', time_field)) * 12) + (DATE_PART('month', now(), time_field))) = 1
THEN CONCAT((((DATE_PART('year', now()) - DATE_PART('year', time_field)) * 12) + (DATE_PART('month', now(), time_field))) ' month ago')
-- day(s)
WHEN DATE_PART('day', now() - time_field) > 1
THEN CONCAT(DATE_PART('day', now() - time_field), ' days ago')
WHEN DATE_PART('day', now() - time_field) = 1
THEN CONCAT(DATE_PART('day', now() - time_field), ' day ago')
-- hour(s)
WHEN ((DATE_PART('day', now() - time_field) * 24) + (DATE_PART('hour', now() - time_field))) > 1
THEN CONCAT((DATE_PART('day', now() - time_field) * 24) + (DATE_PART('hour', now() - time_field))), ' hours ago')
WHEN ((DATE_PART('day', now() - time_field) * 24) + (DATE_PART('hour', now() - time_field))) = 1
THEN CONCAT((DATE_PART('day', now() - time_field) * 24) + (DATE_PART('hour', now() - time_field))), ' hour ago')
-- minute(s)
WHEN ((DATE_PART('day', now() - time_field) * 24) + ((DATE_PART('hour', now() - time_field)) * 60) + (DATE_PART('minute', now() - time_field))) > 1
THEN CONCAT(((DATE_PART('day', now() - time_field) * 24) + ((DATE_PART('hour', now() - time_field)) * 60) + (DATE_PART('minute', now() - time_field))), ' minutes ago')
WHEN ((DATE_PART('day', now() - time_field) * 24) + ((DATE_PART('hour', now() - time_field)) * 60) + (DATE_PART('minute', now() - time_field))) = 1
THEN CONCAT(((DATE_PART('day', now() - time_field) * 24) + ((DATE_PART('hour', now() - time_field)) * 60) + (DATE_PART('minute', now() - time_field))), ' minute ago')
-- seconds
ELSE 'just now'
END AS time_ago
FROM your_table
Обратите внимание, что для дифференциации вам понадобятся повторяющиеся строки кода между 1
и >1
для каждой части времени. Например, вам понадобится 1 day ago
вместо 1 days ago
.
Вот некоторая справочная документация для вас:
Функции даты и времени и операторы
Выражение CASE