【问题标题】:Converting month name to month number in SQL Server在 SQL Server 中将月份名称转换为月份编号
【发布时间】:2020-07-25 04:06:37
【问题描述】:

我有一个接受 varchar 值的列(说 Period_name )。在该列中,我输入了19 年 1 月、2 月 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 

谢谢:)

【问题讨论】:

  • 你能给我们更多的信息吗? Period_name 值是 varchar 类型(你使用什么类型)和你将使用它的返回值(过滤组或仅可视化)

标签: sql sql-server tsql date select


【解决方案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】:

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

    【讨论】:

      【解决方案3】:

      一种简单的方法:

      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
       ...
      

      【讨论】:

        【解决方案4】:

        有几种方法可用,如下所示。逻辑是将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
        

        【讨论】:

          【解决方案5】:

          试试这个:

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

          此代码适用于您的案例。 首先,我们应该通过将默认日期连接为 01 将我们的 varchar 列转换为日期数据类型,然后我们应该使用转换函数返回您的数据类型。

          【讨论】:

            【解决方案6】:
            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
            

            【讨论】:

              【解决方案7】:

              您可以使用datepart()

              SELECT RIGHT(CONCAT('00', DATEPART(MONTH, CONVERT(DATE, CONCAT('01-', period_name)))), 2);
              

              如果您不想要0s,那么只有datepart() 会找到:

              SELECT DATEPART(MONTH, CONVERT(DATE, CONCAT('01-', period_name)));
              

              【讨论】:

                【解决方案8】:

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

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

                demo
                结果:

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

                【讨论】:

                  【解决方案9】:

                  可以使用大小写表达式:

                  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
                  

                  Demo on DB Fiddle

                  select period_name, month(cast('01-' + period_name as date)) month_number
                  from (values ('Jan-19'), ('Feb-19')) t(period_name)
                  
                  GO
                  
                  期间名称 |月数 :------------ | ------------: 一月 19 | 1 2 月 19 日 | 2

                  【讨论】:

                  • 感谢GMB,让我知道是否有其他方法可以做到这一点而无需使用太多的案例陈述
                  猜你喜欢
                  • 2021-10-03
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-12-26
                  • 2011-06-04
                  • 2017-06-17
                  相关资源
                  最近更新 更多