我有一个表存储int
的月份和年份。我需要将其转换为日期(我们可以使用该月的第一天和day
)。
我尝试了类似下面的内容,但在将int
转换为date
AND CAST(ym.year + '-' + ym.month + '-' + '01' AS DATE) BETWEEN @startDate AND @endDate
最终结果应该类似于2016-05-01
,所以我可以根据传递给函数的开始日期和结束日期来检查日期。
答案 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