2014-01-23 1 views
1

Я был бы признателен за любую помощьПолучить индекс первого вхождения полукокса в строке из конца в T-SQL

У меня есть строка, представляющая рабочие дни и выходные дни одного месяца:

@month_col = 'HHWHHWHWWWHHWWWWWHHWWWWWHHWWWWW' -- H - Holiday, W-Working day, total 31 days 

Мне нужно получить index последнего рабочего дня в текущем месяце, который в этом случае 31.

Или если

@month_col = 'HHWHHWHWWWHHWWWWWHHWWWWWHHWWHHH' 

Тогда последний день wotking является 28.

Я знаю, как получить первый рабочий день:

--FIRST WORKING DAY OF MONTH 
    WHILE @index<= @len 
    BEGIN 
    set @char = SUBSTRING(@month_col, @index, 1) 
    IF @char = 'W' 
    begin 
     select @first_day = CHARINDEX(@char, @month_col) 
     break 
    end 
    SET @index= @index+ 1 
    END 

Итак, что о последней? Я попытался повторить попытку, но получив NULL. Спасибо заранее!

ответ

2

Обратный порядок.

SET @Reversed = Reverse(@month_col); 
WHILE @index<= @len 
BEGIN 
set @char = SUBSTRING(@Reversed, @index, 1) 
IF @char = 'W' 
begin 
    select @first_day = CHARINDEX(@char, @Reversed) 
    break 
end 
SET @index= @index + 1 
END 
SET @lastday= @len - @first_day + 1 

EDIT: Я думаю, что ваш исходный код может быть намного проще. Нет необходимости в цикле, используйте CHARINDEX и все.

SELECT @first_day = CHARINDEX('W', @month_col, 1) 

Мой код будет выглядеть следующим образом:

SELECT @first_day = CHARINDEX('W', REVERSE(@month_col), 1) 
SET @lastday= @len - @first_day + 1 
1

Попробуйте это:

MySQL

@month_col = 'HHWHHWHWWWHHWWWWWHHWWWWWHHWWHHH' 

Найдите символ от начала строки

SELECT LOCATE('W', @month_col); 

ВЫВОД:3

Найдите символ с конца строки

SELECT LENGTH(@month_col) + 1 - LOCATE('W', REVERSE(@month_col)); 

ВЫВОД:28


SQL SERVER

@month_col = 'HHWHHWHWWWHHWWWWWHHWWWWWHHWWHHH' 

Найдите символ от начала строки

SELECT CHARINDEX('W', @month_col, 0); 

ВЫВОД:3

Найдите символ с конца строки

SELECT LEN(@month_col) + 1 - CHARINDEX('W', REVERSE(@month_col), 0); 

ВЫВОД:28

1

- Попробуйте

Select CHARINDEX('W', 'HHWHHWHWWWHHWWWWWHHWWWWWHHWWWWW') AS FirstWorkingDay, 
LEN('HHWHHWHWWWHHWWWWWHHWWWWWHHWWWWW') - CHARINDEX('W', REVERSE('HHWHHWHWWWHHWWWWWHHWWWWWHHWWWWW')) -1 AS LastWorkingDay