繁体   English   中英

在 SQL 服务器中将月份名称转换为月份编号

[英]Converting month name to month number in SQL Server

我有一个接受 varchar 值的列(说 Period_name )。 在列内,我输入了Jan-19、Feb-19 等 我需要一个 SQL 指令,只要 Period_name 的左侧像 Jan、Feb 一样,它应该转换为相应的月份数。 例如

输入

Period_name
Jan-19
Feb-19

Output

Period name 
01
02

SQL查询条件如下:

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

谢谢:)

SELECT shortmonths
FROM sys.syslanguages
WHERE langid = 0

退货

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

因此,另一种选择是进行 substring 查找...

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

另一种选择是将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

可以使用 case 表达式:

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

有几种方法可用,其中一种如下所示。 逻辑是将Period_Name转换为日期并使用SQL 服务器 DATEPART() Function

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

您可以像这样使用函数convert()format()

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

查看演示
结果:

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

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

尝试这个:

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

本准则适用于您的情况。 首先,我们应该通过将默认日期连接为 01 将我们的 varchar 列转换为日期数据类型,然后我们应该使用转换 function 来返回您的数据类型。

一个简单的方法:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM