2015-07-14 3 views
2

есть что-то странное здесь. У меня есть база данных, называемая FLDOC. В нем есть столбец под названием SENTENCE, который содержит 7 чисел, которые представляют собой промежуток времени.Переформатирование данных в колонке

example: 
0050000 
0750000 
0000600 
0040615 
0000110 

В этих 7 цифр длиной типа, так как цифры обозначают YYYMMDD

Так что я хотел бы это скрипт, который может преобразовать его в нечто вроде этого:

5Y 00M 00D 
75Y 00M 00D 
6M (or 000Y 6M 00D is fine as well) 
4Y 6M 15D etc etc 

спасибо заранее ...

ответ

2

CONCAT является новым для SQL Server 2012. Если у вас есть предыдущая версия SQL Server, вы можете сделать что-то подобное вместо этого, чтобы достичь желаемого результата:

SELECT sentence 
    ,(
     CASE 
      WHEN cast(left(sentence, 3) AS INT) > 0 
       THEN cast(cast(left(sentence, 3) AS INT) AS VARCHAR(3)) + 'Y ' 
      ELSE cast(left(sentence, 3) AS VARCHAR(3)) + 'Y ' 
      END + 
     CASE 
      WHEN cast(substring(sentence, 4, 2) AS INT) > 0 
       THEN cast(cast(substring(sentence, 4, 2) AS INT) AS VARCHAR(2)) + 'M ' 
      ELSE cast(substring(sentence, 4, 2) AS VARCHAR(2)) + 'M ' 
      END + 
     CASE 
      WHEN cast(right(sentence, 2) AS INT) > 0 
       THEN cast(cast(right(sentence, 2) AS INT) AS VARCHAR(3)) + 'D' 
      ELSE cast(right(sentence, 2) AS VARCHAR(3)) + 'D' 
      END 
     ) AS new_sentence 
FROM FLDOC; 

SQL Fiddle Demo

UPDATE

Чтобы ответить на ваш вопрос ниже в комментариях, вы могли бы, возможно, просто написать заявление обновления, как это:

update FLDOC 
set sentence = (
     CASE 
      WHEN cast(left(sentence, 3) AS INT) > 0 
       THEN cast(cast(left(sentence, 3) AS INT) AS VARCHAR(3)) + 'Y ' 
      ELSE cast(left(sentence, 3) AS VARCHAR(3)) + 'Y ' 
      END + 
     CASE 
      WHEN cast(substring(sentence, 4, 2) AS INT) > 0 
       THEN cast(cast(substring(sentence, 4, 2) AS INT) AS VARCHAR(2)) + 'M ' 
      ELSE cast(substring(sentence, 4, 2) AS VARCHAR(2)) + 'M ' 
      END + 
     CASE 
      WHEN cast(right(sentence, 2) AS INT) > 0 
       THEN cast(cast(right(sentence, 2) AS INT) AS VARCHAR(3)) + 'D' 
      ELSE cast(right(sentence, 2) AS VARCHAR(3)) + 'D' 
      END 
     ) 
+1

Это сработало отлично! Спасибо, что я нахожусь в 2008 и 2012 годах, а также – Sal

+0

umm .. как бы я превратил это в команду обновления? Выглядит отлично в области предварительного просмотра, но ему нужно обновить таблицу. – Sal

+0

@Sal Пожалуйста, проверьте мой ответ выше. Я считаю, что это должно сработать для вас. – FutbolFan

2

Попробуйте этот запрос

select convert(varchar(10),left(example,3))+'Y '+ 
convert(varchar(10),Substring(example,4,3))+'M '+ 
convert(varchar(10),Right(example,3))+'D'+ from tablename 
2

Вы можете сделать это с Concat, а также:

Select Concat 
     (
      Left(SENTENCE, 3), 'Y ', 
      SubString(SENTENCE, 4, 2), 'M ', 
      Right(SENTENCE, 2), 'D' 
     ) 
From Table 

Чтобы уплотнить выражение, как в вашем примере, это может также использоваться:

Select Concat 
     (
      Case When (IsNumeric(Left(SENTENCE, 3)) = 1 And Left(SENTENCE, 3) <> '000') 
      Then Convert(Varchar (3), Convert(Int, Left(SENTENCE, 3))) + 'Y ' End, 

      Case When (IsNumeric(SubString(SENTENCE, 4, 2)) = 1 And SubString(SENTENCE, 4, 2) <> '00') 
      Then Convert(Varchar (2), Convert(Int, SubString(SENTENCE, 4, 2))) + 'M ' End, 

      Case When (IsNumeric(Right(SENTENCE, 2)) = 1 And Right(SENTENCE, 2) <> '00') 
      Then Convert(Varchar (2), Convert(Int, Right(SENTENCE, 2))) + 'D' End 
     ) 
From Table 
+0

удивительным спасибо !! – Sal

Смежные вопросы