【发布时间】:2017-12-12 19:28:21
【问题描述】:
我有几个小时需要以天和小时的格式显示。
这个数字来自DATEDIFF 指令。
对于小于 24 的数字,我希望只显示小时 - 即 21 hours。
对于更大的数字,我希望显示日期和小时 - 即,3 days, 14 hours
我不需要显示任何小于小时的单位,并且值应该向下舍入到前一个小时,因此 1 小时 59 分钟将是 1 小时。
我不能使用存储过程 - 这必须作为单个 select 语句运行。
我知道我可以使用模数来计算值,所以假设 71 小时:
select concat((71 - (71 % 24)) / 24, ' days, ', 71 % 24, ' hours')
然而这有点混乱,因为语句必须是单选,我将不得不计算DATEDIFF 3 次,如下所示。
SELECT CONCAT (
(DATEDIFF(HOUR, StartDate, EndDate) -
(DATEDIFF(HOUR, StartDate, EndDate) % 24)) / 24,
' days, ',
DATEDIFF(HOUR, StartDate, EndDate) % 24,
' hours')
FROM RecordsTable
是否可以直接使用内置 SQL 命令将小时数格式化为天数和小时数,或者如果失败,则将 select (datediff(hour, StartDate, EndDate) 格式化为我可以在单次选择中重复使用的变量?
编辑 - 正如建议的那样,解决方案是使用 CTE,如下所示:
WITH totalhours (htotal) AS
(
SELECT
DATEDIFF(HOUR, StartDate, EndDate) AS htotal
FROM
RecordsTable
)
SELECT
CONCAT ((htotal - (htotal % 24)) / 24,
' days, ',
htotal % 24,
' hours')
FROM
RecordsTable;
【问题讨论】:
-
您可以使用 CTE 获取一次日期差异。然后从 CTE 中选择一条 SQL 语句,因为它作为一条语句执行。或者在recordstable上使用子查询来获取datediff一次......
-
成功了 - 你能发帖作为答案,我会接受吗?
标签: sql-server