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

在SQL Server中将月份名称转换为月份编号,sql,sql-server,tsql,date,select,Sql,Sql Server,Tsql,Date,Select,我有一个接受varchar值的列(称为Period_name)。在列中,我有一些输入,如ejan-19、Feb-19等。每当周期_名称的左边出现Jan、Feb时,我需要一条SQL指令,然后它应该转换为相应的月份号。 比如说 输入 输出 Period name 01 02 SQL查询条件如下: Case When Left(period_name,3) in{'Jan','Feb'} Then Month(Left(period_name,3)) END 谢谢:)您可以使用大小写表达式:

我有一个接受varchar值的列(称为Period_name)。在列中,我有一些输入,如ejan-19、Feb-19等。每当周期_名称的左边出现Jan、Feb时,我需要一条SQL指令,然后它应该转换为相应的月份号。 比如说

输入

输出

Period name 
01
02
SQL查询条件如下:

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

您可以使用大小写表达式:

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

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

GO
期间|名称|月份|编号 :---------- | -----------: 1月19日| 1 2月19日| 2
另一个选择是
尝试将()
转换为
日期

注意: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

有几种可用的方法,其中一种如下所示。逻辑是将
期间名称
转换为日期并使用

part\u 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
这是现场演示

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

SELECT 
    RIGHT('0' + CAST(DATEPART(MM,  + '01-' + Period_Name)  AS VARCHAR(2)), 2) as MonthNumber
FROM @YourTable
您可以使用以下功能:

select format(convert(date, replace(Period_name, '-', ' 01 '), 1), 'MM-yy') result
from tablename
请参见
结果:

返回

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
您可以使用
datepart()

如果不需要
0
s,则只有
datepart()
会找到:

SELECT DATEPART(MONTH, CONVERT(DATE, CONCAT('01-', period_name)));
试试这个:

SELECT LEFT(CONVERT(VARCHAR,CAST('01-'+Column_Name AS DATE),1),2) ,*
FROM Table_Name
此代码适用于您的案例。 首先,我们应该通过将默认日期指定为01,将varchar列转换为日期数据类型,然后使用convert函数返回您的数据类型。

一种简单的方法:

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
 ...
解析/尝试解析:

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

谢谢GMB,让我知道是否有其他方法可以不用太多的案例说明,你能给我们更多的信息吗。Period_name值是varchar类型(您使用的是什么类型)以及您将在其中使用它的返回值(filter group或only visualized)
SELECT DATEPART(MONTH, CONVERT(DATE, CONCAT('01-', period_name)));
SELECT LEFT(CONVERT(VARCHAR,CAST('01-'+Column_Name AS DATE),1),2) ,*
FROM Table_Name
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
 ...
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);