在SQL Server中将月份名称转换为月份编号

时间:2020-04-12 15:13:29

标签: sql sql-server tsql date select

我有一列(例如Period_name)接受varchar值。在此列中,我输入了 Jan-19,Jep-19等。每当Period_name的左侧出现类似于Jan,Feb的时候,我都需要一条SQL指令,然后它将转换为相应的月份号。 例如

输入

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 个答案:

答案 0 :(得分:2)

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 :(得分:1)

另一种选择是将try_convert()变成date

注意:format()是可选的

示例

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

答案 2 :(得分:0)

可以使用大小写表达式:

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 Server的日期解析灵活性。应该将'01-Jan-19'之类的日期识别为日期,因此它应该起作用:

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

Demo on 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

答案 3 :(得分:0)

有几种可用的方法,如下所示。逻辑是将Period_Name转换为日期并使用SQL Server DATEPART() Function

part_name的值不是期望的格式时,可以使用TRY_CAST (Transact-SQL)函数来处理错误。在这种情况下,它将返回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演示。

要获得两位数的数字,可以尝试以下查询。请注意,在这种情况下,您需要将数字转换为字符串。

SELECT 
    RIGHT('0' + CAST(DATEPART(MM,  + '01-' + Period_Name)  AS VARCHAR(2)), 2) as MonthNumber
FROM @YourTable

答案 4 :(得分:0)

您可以像这样使用功能convert()format()

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

请参见demo
结果:

> | result |
> | :----- |
> | 01-19  |
> | 02-19  |

答案 5 :(得分:0)

您可以使用datepart()

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

如果您不想要0,那么只有datepart()会找到:

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

答案 6 :(得分:0)

尝试一下:

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

此代码适用于您的案例。 首先,我们应该通过将默认日期设置为01来将varchar列转换为日期数据类型,然后使用convert函数返回您的数据类型。

答案 7 :(得分:0)

一种简单的方法:

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
 ...

答案 8 :(得分:0)

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);