2013-10-25 80 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