我有开始日期和时间,结束日期和时间。我需要这两者之间的差异,当结束日期和时间为空时,我需要开始日期和时间,当前日期和时间之间的差异......提前感谢。
select pwr.ondate ONDATE,pwr.offdate OFFDATE,mp.process FROMPROCESS,
(select mp.process from mas_process mp where pwr.protoid=mp.p_id) TOPROCESS,
USEDHOURS = case when pwr.offdate is null then
datediff(HH,pwr.ondate,getdate()) else
datediff(d,pwr.ondate,pwr.offdate)
end
from powerreport pwr
inner join mas_process mp on pwr.proid=mp.p_id
答案 0 :(得分:0)
如果您想以格式小时:分钟表示两个日期时间之间的差异,您可以通过首先使用datediff计算两个日期时间之间的总分钟数来获得分钟部分:datediff(MI, startDate, endDate)
然后根据日期结果计算模60。
SQL Server中的modulo运算符为%,因此其表达式为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小提琴,显示了这一点: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;