Labels

Monday, January 20, 2014

Calculate timeago from Current time in SQL

Following function calculates timeago from current time.
For ex.
2 hours 5 minutes ago
23 sec ago etc

CREATE FUNCTION fn_relativeTime (@dateFrom DATETIME)
RETURNS VARCHAR(100)
AS
BEGIN
       DECLARE @ret VARCHAR(100)
       DECLARE @dateTo DATETIME
       DECLARE @tmpdate DATETIME
       DECLARE @years INT
       DECLARE @months INT
       DECLARE @days INT
       DECLARE @hours INT
       DECLARE @minutes INT
       DECLARE @seconds INT
       DECLARE @milliseconds INT

       SELECT @dateTo = getdate()

       SELECT @tmpdate = @dateFrom

       SELECT @years = DATEDIFF(yy, @tmpdate, @dateTo) - CASE WHEN (MONTH(@dateFrom) > MONTH(@dateTo)) OR (MONTH(@dateFrom) = MONTH(@dateTo) AND DAY(@dateFrom) > DAY(@dateTo)
                                  ) THEN 1 ELSE 0 END

       SELECT @tmpdate = DATEADD(yy, @years, @tmpdate)

       SELECT @months = DATEDIFF(mm, @tmpdate, @dateTo) - CASE WHEN DAY(@dateFrom) > DAY(@dateTo) THEN 1 ELSE 0 END

       SELECT @tmpdate = DATEADD(mm, @months, @tmpdate)

       SELECT @days = DATEDIFF(dd, @tmpdate, @dateTo)

       SELECT @tmpdate = DATEADD(dd, @days, @tmpdate)

       SELECT @hours = DATEDIFF(hh, @tmpdate, @dateTo)

       SELECT @tmpdate = DATEADD(hh, @hours, @tmpdate)

       SELECT @minutes = DATEDIFF(mi, @tmpdate, @dateTo)

       SELECT @tmpdate = DATEADD(mi, @minutes, @tmpdate)

       SELECT @seconds = DATEDIFF(ss, @tmpdate, @dateTo)

       SELECT @tmpdate = DATEADD(ss, @seconds, @tmpdate)

       SELECT @milliseconds = DATEDIFF(ms, @tmpdate, @dateTo)

       IF (@years != '0')
              SELECT @ret = cast(@years AS VARCHAR(10)) + ' years ' + (CASE WHEN cast(abs(@months) AS VARCHAR(10)) != '0' THEN cast(abs(@months) AS VARCHAR(10)) + ' months ' ELSE '' END
                           ) + (CASE WHEN cast(abs(@days) AS VARCHAR(10)) != '0' THEN cast(abs(@days) AS VARCHAR(10)) + ' days ' ELSE '' END)
       ELSE
              IF (@months != '0')
                     SELECT @ret = cast(@months AS VARCHAR(10)) + ' months ' + (CASE WHEN cast(abs(@days) AS VARCHAR(10)) != '0' THEN cast(abs(@days) AS VARCHAR(10)) + ' days' ELSE '' END
                                  )
              ELSE
                     IF (@days != '0')
                           SELECT @ret = cast(@days AS VARCHAR(10)) + ' days ' + (CASE WHEN cast(abs(@hours) AS VARCHAR(10)) != '0' THEN cast(abs(@hours) AS VARCHAR(10)) + ' hours' ELSE '' END
                                         )
                     ELSE
                           IF (@hours != '0')
                                  SELECT @ret = cast(@hours AS VARCHAR(10)) + ' hours ' + (CASE WHEN cast(abs(@minutes) AS VARCHAR(10)) != '0' THEN cast(abs(@minutes) AS VARCHAR(10)) + ' minutes' ELSE '' END
                                                )
                           ELSE
                                  IF (@minutes != '0')
                                         SELECT @ret = cast(@minutes AS VARCHAR(10)) + ' minutes ' + (CASE WHEN cast(abs(@seconds) AS VARCHAR(10)) != '0' THEN cast(abs(@seconds) AS VARCHAR(10)) + ' seconds' ELSE '' END
                                                       )

       RETURN @ret
END

Input:
select dbo.fn_relativeTime('2015-03-15')
select dbo.fn_relativeTime('2015-03-15 11:30:25')
select dbo.fn_relativeTime('2015-03-15 11:00')
select dbo.fn_relativeTime('2015-01-15')
select dbo.fn_relativeTime('2014-03-15')
select dbo.fn_relativeTime('2014-01-15')

Output:

No comments:

Post a Comment