TSQL UDF для разделения строки каждые 8 ​​символов - PullRequest
4 голосов
/ 21 мая 2011

Кто-то решил собрать кучу раз в один столбец, поэтому значение столбца может выглядеть следующим образом:

08:00 AM01:00 PM

А другой столбец содержит дату в следующем формате;

20070906

Я хочу написать UDF для нормализации этих данных в одном запросе SQL, чтобы я мог получить обратно 2 строки типа datetime для приведенного выше примера

2007-09-06 08:00:00.000
2007-09-06 13:00:00.000

Преобразование в тип datetimeпросто ... но мне нужно разделить временную часть каждые 8 ​​символов, чтобы получить индивидуальное время.

Кто-нибудь знает о существующей UDF для этого?

Ответы [ 2 ]

8 голосов
/ 21 мая 2011

Попробуйте, это разделит вашу строку на куски указанной длины:

create function SplitString
(   
    @str varchar(max),
    @length int
)
returns @Results table( Result varchar(50) ) 
AS
begin
    declare @s varchar(50)
    while len(@str) > 0
    begin
        set @s = left(@str, @length)
        set @str = right(@str, len(@str) - @length)
        insert @Results values (@s)
    end
    return 
end

Например:

select * from dbo.SplitString('08:00 AM01:00 PM', 8)

даст этот результат:

Результат

08: 00 AM

01: 00 PM

3 голосов
/ 08 февраля 2013

В запросе выше есть ошибка, нижеприведенный запрос исправляет это.Кроме того, я сделал, чтобы возвращаемая таблица содержала столбец последовательности, чтобы можно было определить, в какой последовательности находится разделение:

CREATE function SplitString
(   
    @str varchar(max),
    @length int
)
RETURNS @Results TABLE( Result varchar(50),Sequence INT ) 
AS
BEGIN

DECLARE @Sequence INT 
SET @Sequence = 1

    DECLARE @s varchar(50)
    WHILE len(@str) > 0
    BEGIN
        SET @s = left(@str, @length)
        INSERT @Results VALUES (@s,@Sequence)

        IF(len(@str)<@length)
        BREAK

        SET @str = right(@str, len(@str) - @length)
        SET @Sequence = @Sequence + 1
    END
    RETURN 
END
...