Преобразование названия месяца в номер месяца на сервере SQL - PullRequest
2 голосов
/ 12 апреля 2020

У меня есть столбец (говорит Period_name), который принимает значение varchar. Внутри столбца у меня есть входные данные, такие как 19 января, 19 февраля и др. c. Мне нужна инструкция SQL всякий раз, когда слева от Period_name приходит, как январь, февраль, тогда она должна конвертироваться в соответствующий номер месяца. Например,

Ввод

Period_name
Jan-19
Feb-19

Ввод

Period name 
01
02

Условие запроса SQL выглядит следующим образом:

Case 
When Left(period_name,3) in{'Jan','Feb'} Then Month(Left(period_name,3))
END 

Спасибо :)

Ответы [ 9 ]

2 голосов
/ 12 апреля 2020
SELECT shortmonths
FROM sys.syslanguages
WHERE langid = 0

Возвращает

Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec

Таким образом, другой вариант - поиск подстроки на этом ...

SELECT 1 + NULLIF(CHARINDEX(LEFT(y.period_name,3), l.shortmonths),0)/4
FROM dbo.YourTable y
CROSS JOIN sys.syslanguages l 
WHERE l.langid = 0
1 голос
/ 12 апреля 2020

Еще один вариант - try_convert() в date

Примечание: формат () необязательный

Пример

Declare @YourTable Table ([Period_Name] varchar(50))  Insert Into @YourTable Values 
 ('Jan-19')
,('Feb-19')

Select * 
      ,NewVal = format(try_convert(date,'01-'+Period_Name),'MM')
 from @YourTable

Возвращает

Period_Name NewVal
Jan-19      01
Feb-19      02
0 голосов
/ 12 апреля 2020

PARSE / TRY_PARSE:

select *, 
month(try_parse(v.val as date)), 
month(try_parse(concat(left(v.val+'-', charindex('-', v.val+'-')), '01') as date))
from 
(
values('Jan-19'),('Feb-20'),('Mar-21'),('Apr-03'),('May-18'),('Jun-99'),('Jul-85'),
('Aug-15'), ('Sep-16'),('Oct-'),('Nov'), ('Dec-11')
) as v(val);
0 голосов
/ 12 апреля 2020

Простой подход:

select right(t.period_name, 2) year, m.period, m.name
from
(select '01' period, 'Jan' name
  union
  select '02', 'Feb'
   ...
  union
  select '12', 'Dec') m
inner join table1 t
   on Left(t.period_name,3) = m.name
order by right(t.period_name, 2), m.period

Возврат:

year -- period -- name
19 ----- 01 -------- Jan
19 ----- 02 -------- Feb
19 ----- 03 -------- Mar
 ...
19 ----- 12 -------- Dec
20 ----- 01 -------- Jan
20 ----- 02 -------- Feb
20 ----- 03 -------- Mar
 ...
20 ----- 12 -------- Dec
 ...
0 голосов
/ 12 апреля 2020

Попробуйте:

SELECT LEFT(CONVERT(VARCHAR,CAST('01-'+Column_Name AS DATE),1),2) ,*
FROM Table_Name

Этот код подходит для вашего дела. Во-первых, мы должны преобразовать наш столбец varchar в тип данных date, указав дату по умолчанию как 01, а затем мы должны использовать функцию convert для возврата для вашего типа данных.

0 голосов
/ 12 апреля 2020

Вы можете использовать datepart():

SELECT RIGHT(CONCAT('00', DATEPART(MONTH, CONVERT(DATE, CONCAT('01-', period_name)))), 2);

Если вы не хотите 0 s, то только datepart() найдет:

SELECT DATEPART(MONTH, CONVERT(DATE, CONCAT('01-', period_name)));
0 голосов
/ 12 апреля 2020

Вы можете использовать функции convert() и format() следующим образом:

select format(convert(date, replace(Period_name, '-', ' 01 '), 1), 'MM-yy') result
from tablename

См. demo Результаты:

> | result |
> | :----- |
> | 01-19  |
> | 02-19  |
0 голосов
/ 12 апреля 2020

Есть несколько доступных методов, один из которых показан ниже. Логика c предназначена для преобразования Period_Name в дату и использования функции SQL Server DATEPART () .

. Вы можете использовать TRY_CAST (Transact- SQL) функция для обработки ошибки, когда значение part_name не в ожидаемом формате. В этом случае он вернет null.

SELECT DATEPART(MM,  + '01-' + 'Jan-19') as MonthNumber

Declare @YourTable Table ([Period_Name] varchar(50))  Insert Into @YourTable Values 
 ('Jan-19')
,('Feb-19')

SELECT DATEPART(MM,  + Try_cast('01-' + Period_Name as Date)) as MonthNumber
FROM @YourTable

Вот демо db <> fiddle .

Чтобы получить число в двойном ди git Вы можете попробовать следующий запрос. Обратите внимание, что в этом случае вам необходимо преобразовать число в строку.

SELECT 
    RIGHT('0' + CAST(DATEPART(MM,  + '01-' + Period_Name)  AS VARCHAR(2)), 2) as MonthNumber
FROM @YourTable
0 голосов
/ 12 апреля 2020

Вы могли бы использовать выражение регистра:

case left(period_name, 3)
    when 'Jan' then 1
    when 'Feb' then 2
    when 'Mar' then 3
    ...
    when 'Dec' then 12
end month_number

Но, что еще лучше, вы можете воспользоваться SQL гибким анализом даты сервера. Что-то вроде '01-Jan-19' должно быть распознано как дата, поэтому это должно работать:

month(cast('01-' + period_name as date)) month_number

Демонстрация на DB Fiddle :

select period_name, month(cast('01-' + period_name as date)) month_number
from (values ('Jan-19'), ('Feb-19')) t(period_name)

GO
period_name | month_number
:---------- | -----------:
Jan-19      |            1
Feb-19      |            2
...