2016-09-02 15 views
0

T-SQLのスカラー関数のスクリプティングについてこの質問をすることができますか?コールセンターから、各コールの開始時間と継続時間を含むデータがあります。私は、呼び出しの終了時刻を出力する関数を作成したいと思います。ここでは、データのサンプルです:SQL実行時間に基づいて終了時間を計算する機能

CALLID  EMPLOYEE_ID START_TIME    DURATION  STATUS  
-------- ---------- ----------------------- ------------ ------------ 
796544  205285  2016-07-29 19:29:02.000 00:00:27  Complete  
796543  205284  2016-07-29 19:25:31.000 00:02:31  Complete  
796542  205284  2016-07-29 19:22:01.000 00:00:50  Complete  
796541  205285  2016-07-29 19:11:58.000 00:00:21  Complete  
796540  205285  2016-07-29 19:07:40.000 00:02:16  Complete 

私は動作するはずだと思う機能を作成しましたが、それは常に、それには何も追加せずに開始時刻を返します。私は[DURATION](varchar)を解析し、秒単位で時間を計算し、開始時間にそれを加算します。以下はその外観です:

ALTER FUNCTION [dbo].[AddDuration] (@Duration varchar(8), @StartTime datetime) 
RETURNS datetime 
BEGIN 

DECLARE @Hours  int  = CONVERT(int,SUBSTRING(@Duration,1,2)) 
DECLARE @Minutes int  = CONVERT(int,SUBSTRING(@Duration,4,2)) 
DECLARE @Seconds int  = CONVERT(int,SUBSTRING(@Duration,7,2)) 
DECLARE @EndTime datetime 

SET @EndTime = DATEADD(SECOND,(@Hours * 60 * 60) + (@Minutes * 60) + @Seconds, @StartTime) 

RETURN (@EndTime) 
END 

私は何が欠けていますか?私はSELECTの文の中でまったく同じロジックを実行すると、完全に動作します。しかし、機能はありません。

SELECT [START_TIME] 
    , [END_SELECT] = (DATEADD(SECOND, 
        (CONVERT(int,SUBSTRING(DURATION,1,2))*60*60) 
       + (CONVERT(int,SUBSTRING(DURATION,4,2))*60) 
       + (CONVERT(int,SUBSTRING(DURATION,7,2))) 
       , START_TIME) 
    ) 
    , [END_FUNCTION] = dbo.AddDuration(DURATION,START_TIME) 


START_TIME    END_SELECT    END_FUNCTION 
----------------------- ----------------------- ----------------------- 
2016-08-25 09:21:00.000 2016-08-25 09:24:55.000 2016-08-25 09:21:00.000 
2016-08-25 09:26:00.000 2016-08-25 09:31:22.000 2016-08-25 09:26:00.000 

ありがとうございました!

+0

60 = 3600 :) –

+0

おっと* 60! :) 一定。 –

+0

ああ、私はそれを理解したと思います!私は関数定義でvarcharフィールド(8)の長さを指定しませんでした。私はこの記事でそれをすることを思い出しましたが、後で私のコードを読んだとき、私はその不一致に気付きました。しかし、簡単な方法を教えてくれたゴードンに感謝します!デュレーション文字列をdatetimeとしてキャストすることが可能であることはわかりませんでした。 –

答えて

4

あなたは2つのdatetimesを一緒に加えることができます。そして、あなたの時間は、それが素敵な適切な時間形式であるように見えます。以下の点を考慮してください:

select start_time + cast(cast(duration as time) as datetime) 
from t; 

これはudfよりも簡単です。

0

これを試してみてください:

CREATE TABLE #TABLE1 (CALLID INT,EMPLOYEE_ID INT,START_TIME DATETIME,DURATION TIME, STATUS  VARCHAR(15)) 

INSERT INTO #TABLE1 

SELECT 796544, 205285, '2016-07-29 19:29:02.000', '00:00:27', 'Complete' UNION ALL 
SELECT 796543, 205284, '2016-07-29 19:25:31.000', '00:02:31', 'Complete' UNION ALL  
SELECT 796542, 205284, '2016-07-29 19:22:01.000', '00:00:50', 'Complete' UNION ALL  
SELECT 796541, 205285, '2016-07-29 19:11:58.000', '00:00:21', 'Complete' UNION ALL  
SELECT 796540, 205285, '2016-07-29 19:07:40.000', '00:02:16', 'Complete' 

SELECT *,DATEADD(SECOND, 
       DATEPART(HOUR, DURATION)*60*60 -- HOURS TO SECONDS 
      + DATEPART(MINUTE, DURATION)*60 -- MINUTES TO SECONDS 
      + DATEPART(SECOND,DURATION)  -- SECONDS 
      , START_TIME) END_TIME 
FROM #TABLE1 
関連する問題