显示发布日期和时间,例如 1 小时前或 30 分钟前

Sur*_*dra 3 sql-server sql-server-2008-r2 datetime

我想显示 1 小时前或 30 分钟前的发布日期。这是我的代码:

declare @date datetime ='2014-07-24 11:50:22.033';
SELECT CASE WHEN DATEPART(DD,@date)=DATEPART(DD,GETDATE()) THEN 
  CASE WHEN DATEPART(HH,@date)=DATEPART(HH,GETDATE()) THEN
      CAST(DATEDIFF(MINUTE, @date, GETDATE()) AS NVARCHAR(50)) +' Minutes ago '
     ELSE 
      CAST(DATEDIFF(HOUR, @date, GETDATE()) AS NVARCHAR(50)) + ' Hours ago  ' END
 ELSE
  CAST(DATEDIFF(DAY, @date, GETDATE()) AS NVARCHAR(50)) + ' Days ago.. ' 
END AS Postedon 
Run Code Online (Sandbox Code Playgroud)

当发布时间为 11:50 而服务器时间为 12:10 时,我遇到了问题。在这种情况下,我想显示“20 分钟前”,但我的代码显示 1 小时前。

Mar*_*son 5

正如我在上面的评论中所说,这真的应该在应用程序层中进行格式化,您可以在其中控制向用户的呈现。

问题在于 SQL 处理DATEDIFF函数的方式,因为比较HOUR08:59 和 09:00 之间的差异将导致 1 小时,因为小时已经过去了,8 和 9 之间有 1 小时的差异。

我的解决方案可能不是最优雅的,但它使用差异MINUTE来获取自发布以来经过的小时数,并使用差异HOUR来获取天数。

 declare @date datetime ='2014-07-23 09:50:22.033';
    SELECT 
      CASE 
        WHEN DATEDIFF(SECOND, @date, GETDATE()) < 60 THEN ' Just Posted' 
        WHEN DATEDIFF(MINUTE, @date, GETDATE()) < 60 THEN CAST(DATEDIFF(MINUTE, @date, GETDATE()) AS VARCHAR(10)) + ' Minutes ago'
        WHEN DATEDIFF(MINUTE, @date, GETDATE()) < 24 * 60 THEN CAST(FLOOR(DATEDIFF(MINUTE, @date, GETDATE())/60) AS VARCHAR(10)) + ' Hours ago'
        ELSE CAST(FLOOR(DATEDIFF(HOUR, @date, GETDATE())/24) AS VARCHAR(10)) + ' Days ago'
    END AS Postedon 
Run Code Online (Sandbox Code Playgroud)