我有一列(例如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
谢谢:)
答案 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
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)
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);