sql - 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
解决方案
这是一个示例,它使用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 分钟前的形式的所有可能结果......
推荐阅读
- mongodb - 如何重命名 mongoDB 列大数据?
- python - 时间一到,如何给用户一定的时间来回复和打印消息?(Python)
- php - 在 PHP 中每次迭代后恢复数组项
- java - 在 VScode 上设置 JUnit 4
- class - Kotlin 接口实现的继承
- angular - tsconfig.spec.json 有什么作用?
- java - 如何在 Android Studio 中更改字体大小?
- java - 如何将 java 项目放入 exe 或 jar 中?
- android-studio - 为什么我不能在颤振中添加包
- flutter - 如何有条件地将参数传递给 Flutter/Dart 中的 Widget?