如果您想以小时:分钟的格式表示两个日期时间之间的差异,您可以通过首先使用 datediff 计算两个日期时间之间的总分钟数来获得分钟部分:datediff(MI, startDate, endDate)
然后根据结果计算模 60日期差异。
SQL Server 中的模运算符是 % 所以这个表达式是datediff(MI, startDate, endDate) % 60
我建议创建一个局部变量并用GETDATE()
调用结果填充它,以便在特定记录的结束日期为空的情况下使用完全相同的日期时间计算结果中的所有行。此外,如果您使用IsNull()
结束日期,则可以简化查询,如果结束日期为空,则返回当前时间。
如果将所有这三个放在一起,您将有一个如下所示的查询来计算 powerreport 表中所有记录的差异:
DECLARE @currentTime AS DATETIME;
SET @currentTime = GETDATE();
SELECT *,
USEDHOURS =
CAST (datediff(HH, pwr.ondate,
IsNull(pwr.offdate, @currentTime)) AS VARCHAR) + ':' +
CAST (datediff(MI, pwr.ondate,
IsNull(pwr.offdate, @currentTime)) % 60 AS VARCHAR)
FROM powerreport AS pwr;
这是一个显示此操作的 SQL Fiddle:http ://sqlfiddle.com/#!3/e47af/1
如果您将其插入原始查询,则结果应如下所示:
DECLARE @currentTime AS DATETIME;
SET @currentTime = GETDATE();
SELECT pwr.ondate AS ONDATE,
pwr.offdate AS OFFDATE,
mp.process AS FROMPROCESS,
(SELECT mp.process
FROM mas_process AS mp
WHERE pwr.protoid = mp.p_id) AS TOPROCESS,
USEDHOURS =
CAST (datediff(HH, pwr.ondate,
IsNull(pwr.offdate, @currentTime)) AS VARCHAR) + ':' +
CAST (datediff(MI, pwr.ondate,
IsNull(pwr.offdate, @currentTime)) % 60 AS VARCHAR)
FROM powerreport AS pwr
INNER JOIN
mas_process AS mp
ON pwr.proid = mp.p_id;