2015-03-20 4 views

ответ

1

вам нужны некоторые case, cast, /12 и %12:

declare @value int 
set @value=61 
select 
case when len(cast(@value%12 as int))=1 then '0'+cast(@value%12 as varchar(1)) else cast(cast(@value%12 as int)as varchar(2)) end+ 
case when len(cast(@value/12 as int))=1 then '0'+cast(@value/12 as varchar(1)) else cast(cast(@value/12 as int)as varchar(2)) end 

выход:0105

+0

WOW! Отличные ответы! Спасибо всем за вход! – user3641694

3

Предположительно вы будете иметь запрос следующим образом:

SELECT MONTHS 
FROM MY_TABLE; 

Вы можете сделать некоторое разделение и получить количество да rs:

SELECT MONTHS/12 AS YEARS 
FROM MY_TABLE; 

Затем вам нужно получить оставшееся от этого количество месяцев. Modulo математические операции используются для этого:

SELECT MONTHS % 12 AS MONTHS, 
     MONTHS/12 AS YEARS 
FROM MY_TABLE; 

Теперь вам нужно formatit:

SELECT FORMAT(MONTHS % 12 AS MONTHS, '00'), 
     FORMAT(MONTHS/12 AS YEARS, '00') 
FROM MY_TABLE; 

Наконец, Concat двух результатов вместе:

SELECT CONCAT(FORMAT(MONTHS % 12 AS MONTHS, '00'), 
       FORMAT(MONTHS/12 AS YEARS, '00')) AS RESULT 
FROM MY_TABLE; 
+0

'' FORMAT 'не является признанным встроенным именем функции. 'Для версий' ниже 2014' – jfun

+0

[FORMAT] (https://msdn.microsoft.com/en-us/library/hh213505%28v=sql. 110% 29.aspx) поддерживается в SQL Server ** 2012 ** и выше. – Filburt

+0

Ваша версия сделала вывод ** 0501 ** вместо нужного ** 0105 **, поэтому я взял на себя смелость исправить это. – Filburt

1

Здесь у вас есть два возможные решения:

DECLARE @n INT = 61 

SELECT RIGHT(REPLACE(CONVERT(varchar(8),DATEADD(Month,@n,'2000-01-01'),1),'/',''),4) 

SELECT RIGHT(CAST([email protected]%12*[email protected]/12 AS VARCHAR(5)),4) 
+0

два выбора будут давать разные результаты, т. Е. Для ..., 99,100, ... – jfun

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