将格式dd mon yyyy的日期转换为在SQL中返回月份的整数

时间:2013-09-27 22:47:53

标签: sql sql-server date

我的varchar变量包含值2013年5月1日,我需要获取Month部分的整数。

例如,如果输入2013年5月1日,我应该得到结果为5

我写的查询是:

select DATEPART(MM,CONVERT(DATETIME,CONVERT(VARCHAR(15),'01 '+SUBSTRING(FISCAL_MONTH,1,3)+' 2013'),100))
FROM <table name>

此处FISCAL_MONTH是表格中的列名。但是,此查询向我显示结果,例如11月11日,但也抛出以下错误: Msg 241,Level 16,State 1,Line 1 从字符串转换日期和/或时间时转换失败。

我尝试了各种组合,徒劳无功。请注意,我在查询中需要它。请帮助。

7 个答案:

答案 0 :(得分:2)

如果这是您要转换的唯一日期,则可以将SQL语句简化为:

select datepart(mm,convert(datetime,'01 May 2013'))

答案 1 :(得分:1)

我只是用它进行测试并且有效:

declare @t as varchar(333)
set @t = '01 May 2013'

select datepart(mm,convert(datetime, @t))

给我

5

如果您仍然遇到转换错误,那么您要么有一些 NULL值某些日期值不正确的日期值。检查表格中的数据,看看它是什么。

答案 2 :(得分:0)

我会留给你添加剩下的几个月。

select case substring('01 MAY 2013',4,3) when 'JAN' then 1 
when 'FEB' then 2
when 'MAR' then 3    
when 'APR' then 4
when 'MAY' then 5 
when 'JUN' then 6 else 9999 end

答案 3 :(得分:0)

可能只是在substring参数中有3而不是2:

SUBSTRING(FISCAL_MONTH,1, 2 )+'2013'),100))

concat也可能有效:     选择DATEPART(MM,CONCAT('01 /',子串(转换(varchar(15),'03/23/2013'),1,2),'/ 2013'));

答案 4 :(得分:0)

哇,看到人们提出的所有奇怪的代码真的很有趣。我大部分时间都使用KISS政策(保持简单愚蠢)。

MONTH()函数怎么样?它一直是TSQL语言。我甚至投入了一个联合来处理任何意外的NULLS。

-- Simple date as text
declare @var_test varchar(20) = '01 may 2013';

-- Use coalesce to handle nulls, use month to return int
select month(coalesce(@var_test, '01 jan 1900')) as my_month_index

答案 5 :(得分:0)

Select month ( cast ( date_col as datetime )) From table

答案 6 :(得分:0)

您必须使用正确的格式进行转换,您必须在转换时传递apprpriate格式样式的值。根据MSDN,您使用的是“dd mon yy”格式,因此您必须提供相应的格式样式代码6或106

Declare @FISCAL_MONTH nvarchar(max) = '01 May 2013'
select datepart(mm,Convert(datetime, @FISCAL_MONTH, 6))
--5

Set @FISCAL_MONTH = '01 November 2013'
select datepart(mm,Convert(datetime, @FISCAL_MONTH, 6))
--11