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;