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 小时前。
正如我在上面的评论中所说,这真的应该在应用程序层中进行格式化,您可以在其中控制向用户的呈现。
问题在于 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)
| 归档时间: |
|
| 查看次数: |
4016 次 |
| 最近记录: |