在SQL Server中将月份名称转换为月份编号
我有一个接受varchar值的列(称为Period_name)。在列中,我有一些输入,如ejan-19、Feb-19等。每当周期_名称的左边出现Jan、Feb时,我需要一条SQL指令,然后它应该转换为相应的月份号。 比如说 输入 输出在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 谢谢:)您可以使用大小写表达式:
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);