在SQL Server查询中返回月份名称


81

使用SQL Server 2008,我有一个用于创建视图的查询,并且试图显示月份的名称而不是整数。

在我的数据库中,datetime位于列中OrderDateTime。查询中返回日期的行是:

DATENAME(yyyy, S0.OrderDateTime) AS OrderYear,
DATEPART(MONTH, S0.OrderDateTime) AS OrderMonth

这将返回整数的年份和月份的列。我想返回月份名称(Jan, Feb, etc)。我试过了:

CONVERT(varchar(3), DATEPART(MONTH, S0.OrderDateTime) AS OrderMonth

这显然是不正确的,因为我得到

'AS'附近的语法不正确

信息。我的查询的正确语法是什么?


8
不正确的语法信息是由于之前的未封闭的最后括号AS-CONVERT(varchar(3), DATEPART(MONTH, S0.OrderDateTime)) AS OrderMonth
Jaymz

sql查询中的S0是什么意思
user7157710 2016-11-14

@ user7157710 S0是字段所在表的别名。
tia97

Answers:


154

这将为您提供月份的全名。

select datename(month, S0.OrderDateTime)

如果您只想要前三个字母,可以使用此

select convert(char(3), S0.OrderDateTime, 0)

错误回答 “ SQL查询中的S0是什么?”的评论不正确 由user7157710
Petter Friberg

1
S0是表的别名。答案是从问题中继承过来的。
Bpainter

我想补充一点,通常,您甚至不想使用这些功能。您最好将日期选择为date(time)或month作为整数或其他,然后让您的UI负责将其“转换”为对人类友好的月份名称。这样,您的应用程序/ UI可以处理本地化而不是数据库,这对用户的首选项或应用程序的本地化设置没有丝毫提示。换句话说,请这样考虑:如果您的用户更喜欢中文二月而不是二月份,该怎么办?
RobIII

18

你试过了DATENAME(MONTH, S0.OrderDateTime)吗?


12

更改:

CONVERT(varchar(3), DATEPART(MONTH, S0.OrderDateTime) AS OrderMonth

至:

CONVERT(varchar(3), DATENAME(MONTH, S0.OrderDateTime)) AS OrderMonth

我想你的意思是DATENAMEDATEPART不会这样做。
德鲁伊




1

这将为您提供您所要求的:

select convert(varchar(3),datename(month, S0.OrderDateTime)) 


0

不打分贝,我们可以获取所有月份的名称。

WITH CTE_Sample1 AS
(
    Select 0 as MonthNumber

    UNION ALL

    select MonthNumber+1 FROM CTE_Sample1
        WHERE MonthNumber+1<12
)

Select DateName( month , DateAdd( month , MonthNumber ,0 ) ) from CTE_Sample1

0

基本上这个...

declare @currentdate datetime = getdate()
select left(datename(month,DATEADD(MONTH, -1, GETDATE())),3)
union all
select left(datename(month,(DATEADD(MONTH, -2, GETDATE()))),3)
union all
select left(datename(month,(DATEADD(MONTH, -3, GETDATE()))),3)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.