将YearMonth格式化为荷兰月份名称

时间:2017-10-05 12:52:37

标签: sql sql-server stored-procedures

我有以下YearMonth数据:

201601
201602
201603

等等。

我需要将它们转换为荷兰月份名称,格式为“MMM”

所以201601应该成为'jan' 201602应该成为'feb'

我有以下代码:

SELECT FORMAT(RIGHT(YearMonth,2),'MMM', 'nl-NL') as monthname

我收到此错误:

Argument data type varchar is invalid for argument 1 of format function.

我做错了什么?

3 个答案:

答案 0 :(得分:0)

如果yearmonth是整数,那么您可以先将其转换为date然后再使用format()

create table t (yearmonth int)
insert into t values (201601),(201602),(201603)

select format(
    convert(date,convert(varchar(10),yearmonth*100+1))
    ,'MMM','nl-NL') as monthname
from t

rextester演示:http://rextester.com/NPPN83037

返回:

+-----------+
| monthname |
+-----------+
| jan       |
| feb       |
| mrt       |
+-----------+

如果yearmonth是字符类型:

select format(
    convert(date,yearmonth+'01')
    ,'MMM','nl-NL') as monthname
from v

答案 1 :(得分:0)

如果YearMonth的类型为int,那么您可以使用以下sql语句:

SELECT FORMAT(DATEFROMPARTS(201710 / 100, 201710 % 100, 1), 'MMM', 'nl-NL')

,结果是:okt

  

TODO将201710更改为YearMonth

解释

  • DATEFROMPARTS需要3个参数YearMonthDay。第一个参数的计算方法是除以100:201710 / 100 = 2017 (int / int = int)。第二个参数使用模运算符计算:201710 % 100 = 10

样品

CREATE TABLE #tempDates (YearMont int)

INSERT INTO #tempDates VALUES(201710)
INSERT INTO #tempDates VALUES(201711)
INSERT INTO #tempDates VALUES(201712)
INSERT INTO #tempDates VALUES(201801)

SELECT FORMAT(DATEFROMPARTS(YearMont / 100, YearMont % 100, 1), 'MMM', 'nl-NL') monthname FROM #tempDates

结果

-------------
| monthname |
|-----------|
| okt       |
| nov       |
| dec       |
| jan       |
-------------

答案 2 :(得分:0)

错误是因为FORMAT不接受第一个参数的字符串。使用RIGHT函数隐式地将结果转换为字符串。

您可以将RIGHT的输出转换回一个数字,但如果仅使用数学运算,则语句的效果会更好。 201710%100将仅返回10的剩余部分。

请注意,在跨多行使用时,FORMAT命令可能会非常慢。您可以更好地更改会话语言并使用其他日期功能(如DATENAME)。