![](/img/trans.png)
[英]Extracting month number and converting it into month name in SQL Server
[英]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
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
您可以使用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.