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



我有一个包含值 01 May 2013 的 varchar 变量,我需要获取 Month 部分的整数。

例如,如果输入 01 May 2013,我应该得到结果为 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,级别 16,状态 1,第 1 行从字符串转换日期和/或时间时转换失败。

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

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

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

我只是用它来测试它,它起作用了:

declare @t as varchar(333)
set @t = '01 May 2013'
select datepart(mm,convert(datetime, @t))

给我

5

如果您仍然收到该转换错误,则您有一些 NULL 值某些格式不正确的日期值。 检查表中的数据,看看是哪个。

我会把它留给你添加剩余的月份。

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 而不是 2:

子字符串(FISCAL_MONTH,1,2)+' 2013'),100))

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

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

MONTH() 函数怎么样。 它一直存在于 TSQL 语言中。 我什至投入了一个合并来处理任何意外的 NULL。

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

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

您必须使用正确的格式进行转换,您必须在转换时传递适当的格式样式值。根据 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

最新更新