我有开始日期和时间和结束日期&时间......我需要开始和结束之间的区别

时间:2013-01-25 07:59:57

标签: sql date

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

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 

1 个答案:

答案 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;