0

開始日時と終了日時があります。これら2つの違いが必要で、終了日と時刻がnullの場合、開始日と時刻と現在の日付と時刻の違いが必要です......よろしくお願いします。

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

2 つの datetime の差を hour:minute の形式で表現したい場合は、最初に datediff を使用して 2 つの datetime 間の合計分数を計算することで分の部分を取得できますdatediff(MI, startDate, endDate)。 datediff.

SQL Serverのモジュロ演算子は % なので、式は次のようになります。datediff(MI, startDate, endDate) % 60

GETDATE()特定のレコードの終了日がnullの場合、結果のすべての行がまったく同じ日時を使用して計算されるように、ローカル変数を作成して呼び出しの結果を入力することをお勧めします。さらに、終了日に対して使用するとクエリを簡素化しIsNull()、終了日が null の場合は現在の時刻を返すことができます。

これら 3 つすべてを組み合わせると、次のようなクエリが作成され、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 に答える