TSQL月份和年初至今的转换

时间:2016-06-02 15:52:12

标签: sql-server tsql stored-procedures

我有一个表存储int的月份和年份。我需要将其转换为日期(我们可以使用该月的第一天和day)。

我尝试了类似下面的内容,但在将int转换为date

时遇到了错误
AND CAST(ym.year + '-' + ym.month + '-' + '01' AS DATE) BETWEEN @startDate AND @endDate

最终结果应该类似于2016-05-01,所以我可以根据传递给函数的开始日期和结束日期来检查日期。

6 个答案:

答案 0 :(得分:2)

你可以尝试这样的东西,根据你的需要进行修改:

declare @YY int = 2016
declare @MM int = 5
select CAST(CAST(@YY as varchar(4)) + '-' + RIGHT('00' + CAST(@MM as varchar(2)),2) + '-01' as DATE)

答案 1 :(得分:2)

从SQL Server 2012开始,您可以使用DATEFROMPARTS

AND DATEFROMPARTS(ym.year, ym.month, 1) BETWEEN @startDate AND @endDate

答案 2 :(得分:2)

AND DateFromParts(ym.year, ym.month, 1) BETWEEN @startDate AND @endDate

编辑:对于旧版本的SQL:

SELECT CAST(CAST(ym.year*10000+ym.month*100+1 AS CHAR(8)) AS DATETIME)

答案 3 :(得分:0)

如果您在2008年或更低时间,这将有效

select cast(
            cast(ym.year as varchar(4))+
            case when len(ym.month) < 2 then '0' + cast(ym.month as varchar(2)) else cast(ym.month as varchar(2)) end +
            '01' as date) 

您获得的错误是因为当您CONCAT INT时,您的CAST到{{1基本上缺少值来进行转换。这里我们根据长度填充。

答案 4 :(得分:0)

试试这个:

CAST(CAST(ym.year AS varchar) + '-' + CAST(ym.month AS varchar) + '-01'  AS DATETIME)

答案 5 :(得分:0)

您可以按照数据的方式创建一个月,月和日的表作为月的第一个,然后加入表。对于大型表格而言,这可能会更快,特别是如果原始表格中的年数和月数有限。

因此,如果您的原始表格中包含年份数据,则只需要12条记录,作为加入的加入应该很快。

为避免错过日期,请从原始数据构建查找表:

SELECT year, month, cast(cast(year*10000+month*100+1 as char(8)) as date) as FirstOfMonth 
INTO #FirstOfMonth FROM mytable GROUP BY year, month