2013-10-25 81 views
0

我有3个VARCHAR时间范围,它应转换为启动&完成时间值,将varchar转换为时间范围

这里的值:

SCH 
- 9:00-12:00 
- 13-15:00 
- 15-17:30 

所以我尝试自己分成启动时间和结束,并转换为时间值

这里是我的分裂功能:

CREATE FUNCTION dbo.Split 
(
    @RowData nvarchar(2000), 
    @SplitOn nvarchar(5) 
) 
RETURNS @RtnValue table 
(
    Id int identity(1,1), 
    Data nvarchar(100) 
) 
AS 
BEGIN 
    Declare @Cnt int 
    Set @Cnt = 1 

    While (Charindex(@SplitOn,@RowData)>0) 
    Begin 
     Insert Into @RtnValue (data) 
     Select 
      Data = ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1))) 

     Set @RowData = Substring(@RowData,Charindex(@SplitOn,@RowData)+1,len(@RowData)) 
     Set @Cnt = @Cnt + 1 
    End 

    Insert Into @RtnValue (data) 
    Select Data = ltrim(rtrim(@RowData)) 

    Return 
END 

和我开始&完成值由做这在我的dev的查询,但是当我试图转换15-17:30,我得到一个错误的转换,因为起步值仅为15:

declare @valueToParse varchar(20) = '15-17:30' 

    select @schtimestart = data from dbo.split(@valueToParse,'-') where id=1 
    select @schtimefinish = data from dbo.split(@valueToParse,'-') where id=2 
    SELECT CAST(@schtimestart AS time) 
    SELECT CAST(@schtimefinish AS time) 

如何仅将一个值转换为时间值,或者是否存在任何简单的转换?

回答

0

我已经解决我的分裂功能,因此,如果开始时没有分值,它会自动添加

这里是我的代码

USE [Dispatch] 
GO 
/****** Object: UserDefinedFunction [dbo].[Split] Script Date: 25/10/2013 09:39:51 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

alter FUNCTION dbo.Split 
(
    @RowData nvarchar(2000), 
    @SplitOn nvarchar(5) 
) 
RETURNS @RtnValue table 
(
    Id int identity(1,1), 
    Data nvarchar(100) 
) 
AS 
BEGIN 
    Declare @Cnt int 
    Set @Cnt = 1 
    declare @tmp as varchar(20) 
    While (Charindex(@SplitOn,@RowData)>0) 
    Begin 
     SET @tmp = ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1))) 
     Insert Into @RtnValue (data) 
     Select Data = case when ISNUMERIC(SUBSTRING(@tmp,1,2)) = 1 AND ISNUMERIC(SUBSTRING(@tmp,4,2)) = 1 then @tmp else (@tmp + ':00') END 

     Set @RowData = Substring(@RowData,Charindex(@SplitOn,@RowData)+1,len(@RowData)) 
     Set @Cnt = @Cnt + 1 
    End 

    Insert Into @RtnValue (data) 
    Select Data = ltrim(rtrim(@RowData)) 

    Return 
END