2017-04-14 19 views
-1

私はSQLで質問があります。 私はMS SQL Server 2012を使用しています Close_timeとOpen_timeの違いを計算する必要があります。 年 - 月 - 日 - 時 - 分 - 秒の範囲をどのようにすることができますか。例については **:Close_timeとOpen_timeの時間間隔

Start_time : 2017:01.01 20:30:15 
Close_time : 2018.02.05 22:58:35 
Output: 0001:01:04 02:28:20** 

私はそれが時間間隔ではありませんので、これは、正しくないことを知っています。

Select Name, 
Convert(VARCHAR,CAST(AVG(CAST(CAST(CLOSE_TIME as datetime) - CAST(OPEN_TIME as datetime)as float)) as datetime), 120)as TM 
From [dbo].[INCIDENTS] 
+0

使用しているデータベースとのあなたの質問にタグを付けます。 –

+0

これは、MySQL、SQL-Serverなどを使用しているかどうかによって異なります。使用している質問を更新してください。 – toonice

答えて

0

あなたのコードは、SQL Serverを推奨します。

SELECT CAST(CLOSE_TIME as datetime) - CAST(OPEN_TIME as datetime) 

注:実際には、日付/時刻値などのフィールドを保存する必要があります。もしあなたがそうであれば、それらを減算するだけです:

SELECT (CLOSE_TIME - OPEN_TIME) 
0

あなたはUDFを開いている場合。この表価値関数は、正確で実績のあるものです。

希望のフォーマットであるELAPSEDと呼ばれるフィールドを追加しましたが、年、月、日、時、分、秒を残しました。興味

CREATE FUNCTION [dbo].[udf-Date-Elapsed] (@D1 DateTime,@D2 DateTime) 
Returns Table 
Return (
    with cteBN(N) as (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)), 
     cteRN(R) as (Select Row_Number() Over (Order By (Select NULL))-1 From cteBN a,cteBN b,cteBN c), 
     cteYY(N,D) as (Select Max(R),Max(DateAdd(YY,R,@D1))From cteRN R Where DateAdd(YY,R,@D1)<[email protected]), 
     cteMM(N,D) as (Select Max(R),Max(DateAdd(MM,R,D)) From (Select Top 12 R From cteRN Order By 1) R, cteYY P Where DateAdd(MM,R,D)<[email protected]), 
     cteDD(N,D) as (Select Max(R),Max(DateAdd(DD,R,D)) From (Select Top 31 R From cteRN Order By 1) R, cteMM P Where DateAdd(DD,R,D)<[email protected]), 
     cteHH(N,D) as (Select Max(R),Max(DateAdd(HH,R,D)) From (Select Top 24 R From cteRN Order By 1) R, cteDD P Where DateAdd(HH,R,D)<[email protected]), 
     cteMI(N,D) as (Select Max(R),Max(DateAdd(MI,R,D)) From (Select Top 60 R From cteRN Order By 1) R, cteHH P Where DateAdd(MI,R,D)<[email protected]), 
     cteSS(N,D) as (Select Max(R),Max(DateAdd(SS,R,D)) From (Select Top 60 R From cteRN Order By 1) R, cteMI P Where DateAdd(SS,R,D)<[email protected]) 

    Select [Years] = cteYY.N 
      ,[Months] = cteMM.N 
      ,[Days] = cteDD.N 
      ,[Hours] = cteHH.N 
      ,[Minutes] = cteMI.N 
      ,[Seconds] = cteSS.N 
      ,[Elapsed] = Format(cteYY.N,'0000')+':'+Format(cteMM.N,'00')+':'+Format(cteDD.N,'00')+' '+Format(cteHH.N,'00')+':'+Format(cteMI.N,'00')+':'+Format(cteSS.N,'00') 
    From cteYY,cteMM,cteDD,cteHH,cteMI,cteSS 
) 
--Max 1000 years 
--Select * from [dbo].[udf-Date-Elapsed] ('1991-09-12 21:00:00.000',GetDate()) 
--Select * from [dbo].[udf-Date-Elapsed] ('2017-01-01 20:30:15','2018-02-05 22:58:35') 
場合戻り

ID DateBeg     DateEnd      Elapsed 
1 2017-01-01 20:30:15.000 2018-02-05 22:58:35.000  0001:01:04 02:28:20 

UDF

Declare @YourTable table (ID int,DateBeg datetime,DateEnd datetime) 
Insert Into @YourTable values 
(1,'2017-01-01 20:30:15','2018-02-05 22:58:35') 

Select A.* 
     ,B.Elapsed 
From @YourTable A 
Cross Apply [dbo].[udf-Date-Elapsed](A.DateBeg,A.DateEnd) B 

を所望であれば、これらを除去することができます

EDIT - スカラー値関数の

Select [dbo].[udf-Str-Elapsed] ('2017-01-01 20:30:15','2018-02-05 22:58:35') 

戻り

0001:01:04 02:28:20 

スカラー関数

CREATE FUNCTION [dbo].[udf-Str-Elapsed] (@D1 DateTime,@D2 DateTime) 
Returns varchar(100) 
AS 
Begin 
    Declare @RetVal varchar(100) 
    ;with cteBN(N) as (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)), 
      cteRN(R) as (Select Row_Number() Over (Order By (Select NULL))-1 From cteBN a,cteBN b,cteBN c), 
      cteYY(N,D) as (Select Max(R),Max(DateAdd(YY,R,@D1))From cteRN R Where DateAdd(YY,R,@D1)<[email protected]), 
      cteMM(N,D) as (Select Max(R),Max(DateAdd(MM,R,D)) From (Select Top 12 R From cteRN Order By 1) R, cteYY P Where DateAdd(MM,R,D)<[email protected]), 
      cteDD(N,D) as (Select Max(R),Max(DateAdd(DD,R,D)) From (Select Top 31 R From cteRN Order By 1) R, cteMM P Where DateAdd(DD,R,D)<[email protected]), 
      cteHH(N,D) as (Select Max(R),Max(DateAdd(HH,R,D)) From (Select Top 24 R From cteRN Order By 1) R, cteDD P Where DateAdd(HH,R,D)<[email protected]), 
      cteMI(N,D) as (Select Max(R),Max(DateAdd(MI,R,D)) From (Select Top 60 R From cteRN Order By 1) R, cteHH P Where DateAdd(MI,R,D)<[email protected]), 
      cteSS(N,D) as (Select Max(R),Max(DateAdd(SS,R,D)) From (Select Top 60 R From cteRN Order By 1) R, cteMI P Where DateAdd(SS,R,D)<[email protected]) 

    Select @RetVal = Format(cteYY.N,'0000')+':'+Format(cteMM.N,'00')+':'+Format(cteDD.N,'00')+' '+Format(cteHH.N,'00')+':'+Format(cteMI.N,'00')+':'+Format(cteSS.N,'00') 
    From cteYY,cteMM,cteDD,cteHH,cteMI,cteSS 

    Return @RetVal 

End