SQL 根据持续时间计算结束时间的函数不起作用
SQL Function to calculate end time based on duration not working
你能帮我解决这个关于在 T-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
我创建了一个我认为应该可以使用的函数,但它总是 returns 开始时间而没有添加任何内容。我希望它解析 [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
感谢您的帮助!
您可以将两个日期时间相加。而且,你的时间看起来是一个很好的正确时间格式。您可能会考虑:
select start_time + cast(cast(duration as time) as datetime)
from t;
这似乎比 udf 更简单。
试试这个:
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
你能帮我解决这个关于在 T-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
我创建了一个我认为应该可以使用的函数,但它总是 returns 开始时间而没有添加任何内容。我希望它解析 [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
感谢您的帮助!
您可以将两个日期时间相加。而且,你的时间看起来是一个很好的正确时间格式。您可能会考虑:
select start_time + cast(cast(duration as time) as datetime)
from t;
这似乎比 udf 更简单。
试试这个:
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