Best way to convert DateTime to “n Hours Ago” in SQL

前端 未结 7 1871
醉酒成梦
醉酒成梦 2021-01-18 03:52

I wrote a SQL function to convert a datetime value in SQL to a friendlier \"n Hours Ago\" or \"n Days Ago\" etc type of message. And I was wondering if there was a better wa

7条回答
  •  春和景丽
    2021-01-18 04:12

    Thanks for the various code posted above.

    As Hafthor pointed out there are limitations of the original code to do with rounding. I also found that some of the results his code kicked out didn't match with what I'd expect e.g. Friday afternoon -> Monday morning would show as '2 days ago'. I think we'd all call that 3 days ago, even though 3 complete 24 hour periods haven't elapsed.

    So I've amended the code (this is MS SQL). Disclaimer: I am a novice TSQL coder so this is quite hacky, but works!!

    I've done some overrides - e.g. anything up to 2 weeks is expressed in days. Anything over that up to 2 months is expressed in weeks. Anything over that is in months etc. Just seemed like the intuitive way to express it.

    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
    

提交回复
热议问题