0

我有开始日期和时间和结束日期和时间。我需要这两者之间的差异,当结束日期和时间为空时,我需要开始日期和时间与当前日期和时间之间的差异......提前致谢。

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 
4

1 回答 1

0

如果您想以小时:分钟的格式表示两个日期时间之间的差异,您可以通过首先使用 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;
于 2013-01-26T06:20:02.723 回答