首页 > 解决方案 > Sql Server 以“X 秒/分钟/小时/天”格式获取时间

问题描述

我正在开发 SQL SERVER 2016。我需要向用户显示自上次操作以来经过的时间。它的格式应类似于“最后一次操作是 3 分钟前”或“最后一次操作是 5 天前”。我需要动态的 datepart 间隔,因为我不知道已经过去了多少时间。系统应获取时间间隔(如果小于一小时,则必须为分钟。如果小于一天,则应为小时)和以该间隔格式传递的时间(如 3 小时前或 1 天前)。

我现在写这个

FORMAT(DATEDIFF(MINUTE,MAX(myDate),GETDATE()), 'MINUTE' , 'en-US')

但它的结果是

“最后一次行动是 MINUTE 前”

如果时间间隔发生变化,我还想以其他格式获取时间,例如“5 天前”或“4 小时前”。

我怎么能做到这一点,我找不到合适的datediff间隔和FORMAT

标签: sqlsql-serverdatabase

解决方案


这是一个示例,它使用CONCAT和一些硬编码值来根据您的问题的要求生成输出:

SELECT
    CONCAT('Last Action was ',
            DATEDIFF(MINUTE, '2020-10-07T11:06:22', '2020-10-07T11:07:22'),
            ' MINUTE ago'
    ) AS "Elapsed"

输出是

|         Elapsed            |
------------------------------
|Last Action was 1 MINUTE ago|

DATEDIFF如果您想要考虑不同的单位,您将不得不用您选择的值和函数的间隔替换那些硬编码的时间戳。

另一种可能的解决方案是:

SELECT
    'Last Action was ' +
    CASE WHEN DATEDIFF(DAY, '2020-10-07T11:06:22', '2020-10-08T11:07:22') > 0
        THEN CONCAT(DATEDIFF(DAY, '2020-10-07T11:06:22', '2020-10-08T11:07:22'), ' DAY(S)')
        ELSE ''
    END +
    CASE WHEN DATEDIFF(HOUR, '2020-10-07T11:06:22', '2020-10-08T11:07:22') % 24 > 0
        THEN CONCAT(DATEDIFF(HOUR, '2020-10-07T11:06:22', '2020-10-08T11:07:22') % 24, ' HOUR(S)')
        ELSE ''
    END + ' and ' +
    CASE WHEN DATEDIFF(MINUTE, '2020-10-07T11:06:22', '2020-10-08T11:07:22') % 60 > 0
        THEN CONCAT(DATEDIFF(MINUTE, '2020-10-07T11:06:22', '2020-10-08T11:07:22') % 60, ' MINUTE(S) ago')
        ELSE ''
    END AS "Message"

哪个输出

|                  Message                     |
------------------------------------------------
| Last Action was 1 DAY(S) and 1 MINUTE(S) ago |

如您所见,结果列中未提及小时数,因为它们的值正好是 24 小时,而这已经打印了一天。

您将不得不摆弄才能获得最后一次行动是 2 小时 1 分钟前上次行动是 1 天 2 小时 1 分钟前的形式的所有可能结果......


推荐阅读