2015-11-20 5 views
0

Я пытаюсь добавить строки, которые являются целыми числами. У меня есть 201404 в качестве входных данных, и мне нужно, чтобы он был преобразован в 201503, поэтому единственный способ сделать это - увеличить год (2014) на 1 и уменьшить месяц 02 на 1. Я пробовал нижеследующий, но ведущий ноль в месяц, кажется, не сохранить:SQL Добавление целых строк с нулевыми значениями

DECLARE @YearMonth INT = 201404 
    , @left INT = 0 
    , @right INT = 0 

SET @YearMonth = CAST(@YearMonth AS VARCHAR(6)) 
SET @left = CAST(LEFT(@YearMonth, 4) + 1 AS VARCHAR(MAX)) 
SET @right = RIGHT(@YearMonth, 2) - 1 
SET @right = CAST(@right AS VARCHAR(2)) 
SET @right = RIGHT(('0' + CAST(@right AS VARCHAR(2))), 2) 

PRINT @left 
PRINT RIGHT('0' + LTRIM(RTRIM(@right)), 6) 

ответ

0

Использовать обычные REPLICATE

копировщика ('0', 2 - Len (@right)) + @right

+0

ОК классный! и как сделать проверку, чтобы увидеть, если, например, дата 201411, тогда не должно быть нулевой репликации. –

+0

Вам не обязательно. Это будет только поле, если целевая строка слишком короткая. – nicomp

0

Просто побежал это:

DECLARE @YearMonth INT = 201404; 

SELECT CONVERT(VARCHAR(6), DATEPART(YEAR, T.Data) + 1) + RIGHT(100 + DATEPART(MONTH, T.Data) -1, 2) 
FROM (VALUES (CONVERT(VARCHAR(8), @YearMonth) + '01')) AS T(Data); 

Результат:

201503 

Это будет выбрать номер месяца и добавить 100 к нему, а затем выбрать 2 правильных символов от него, так, например, вы получили 4, становится 104, а затем RIGHT функция выбирает последние 2 символа, которые 04.

Проверен с другим Params, кажется, хорошо:

DECLARE @YearMonth INT = 201411; 

SELECT CONVERT(VARCHAR(6), DATEPART(YEAR, T.Data) + 1) + RIGHT(100 + DATEPART(MONTH, T.Data) -1, 2) 
FROM (VALUES (CONVERT(VARCHAR(8), @YearMonth) + '01')) AS T(Data); 

Результат:

201510 
1

Работа с целочисленным форматом YYYYMM может быть затруднены при добавлении и вычитания месяцев. Один из способов - конвертировать в несколько месяцев, а затем преобразовать обратно в формат. Таким образом, это преобразует значение в несколько месяцев

select (@YearMonth/100) * 12 + (@YearMonth % 100) 

Тогда мы можем добавить ряд, например, 11 и преобразовать обратно в формат целого:

select (((@YearMonth/100) * 12 + (@YearMonth % 100) + 11)/12) * 100 + 
     ((@YearMonth/100) * 12 + (@YearMonth % 100) + 11) % 12) 
     ) as yyyymm 

Другой метод, который может быть проще является для использования арифметики по дням:

select dateadd(11, month, cast(@YearMonth as varchar(255)) + '01') 

Это возвращает дату. Вы можете преобразовать его обратно в число как:

select (year(dateadd(11, month, cast(@YearMonth as varchar(255)) + '01')) * 100 + 
     month(dateadd(11, month, cast(@YearMonth as varchar(255)) + '01')) 
     ) as yyyymm 
+0

Добавление 11 месяцев кажется лучшим :) –

0

Я бы конвертировал неявно на сегодняшний день, добавив 11 месяцев, а затем отформатировав обратно в виде строки. Целочисленное преобразование также будет неявным.

select format(dateadd(month, 11, str(@YearMonth) + '01'), 'yyyyMM') 
Смежные вопросы