Спасибо за код, указанный выше.
Как отметил Хафтор, есть ограничения исходного кода, связанные с округлением. Я также обнаружил, что некоторые результаты, которые вычеркнул его код, не совпадают с ожидаемыми, например, День пятницы -> утро понедельника будет отображаться как «2 дня назад». Я думаю, что мы все позвонили бы это 3 дня назад, хотя 3 полных 24-часовых периода не истекли.
Итак, я исправил код (это MS SQL). Отказ от ответственности: я начинающий программист TSQL, так что это довольно хакерский, но работает !!
Я сделал несколько переопределений - например, все до 2 недель выражается в днях. Все, что превышает 2 месяца, выражается в неделях. Все, что за это в месяцах и т. Д. Просто выглядело как интуитивный способ выразить это.
CREATE FUNCTION [dbo].[GetFriendlyDateTimeValue]( @CompareDate DATETIME ) RETURNS NVARCHAR(48) AS BEGIN
declare @s nvarchar(48)
set @s='Now'
select top 1 @s=convert(nvarchar,abs(n))+' '+s+case when abs(n)>1 then 's' else '' end+case when n>0 then ' ago' else ' from now' end from (
select convert(int,(convert(float,(getdate()-@comparedate))*n)) as n, s from (
select 1/365 as n, 'year' as s union all
select 1/30, 'month' union all
select 1/7, 'week' union all
select 1, 'day' union all
select 24, 'hour' union all
select 24*60, 'minute' union all
select 24*60*60, 'second'
) k
) j where abs(n)>0 order by abs(n)
if @s like '%days%'
BEGIN
-- if over 2 months ago then express in months
IF convert(nvarchar,DATEDIFF(MM, @CompareDate, GETDATE())) >= 2
BEGIN
select @s = convert(nvarchar,DATEDIFF(MM, @CompareDate, GETDATE())) + ' months ago'
END
-- if over 2 weeks ago then express in weeks, otherwise express as days
ELSE IF convert(nvarchar,DATEDIFF(DD, @CompareDate, GETDATE())) >= 14
BEGIN
select @s = convert(nvarchar,DATEDIFF(WK, @CompareDate, GETDATE())) + ' weeks ago'
END
ELSE
select @s = convert(nvarchar,DATEDIFF(DD, @CompareDate, GETDATE())) + ' days ago'
END
return @s
END