在SQL Server中将一年中的日期转换为日期时间

3

在数据库表(SQL Server 2012)中,我保存了日期格式为yyyyxxx,其中xxx是一年中的第几天。例如2015-08-11对应2015223

如何高效地将这种格式转换为DATETIME?将DATETIME转换为这种格式怎么做?


2
你能做的最好的事情就是停止将日期时间值存储在除datetime之外的任何数据类型中。 - Sean Lange
2个回答

6
获取年份部分,转换为日期时间+添加天数。
DECLARE @var NVARCHAR(100) = '2015223';

SELECT CAST(LEFT(@var, 4) AS DATETIME) +  CAST(RIGHT(@var, 3) AS INT) - 1;

或者:

DECLARE @var NVARCHAR(100) = '2015223';

SELECT DATEADD(dd,CAST(RIGHT(@var, 3) AS INT)-1, CAST(LEFT(@var, 4) AS DATETIME))

或者如果yyyyxxx是INT类型:

DECLARE @var INT = 2015223;

SELECT DATEADD(dd,(@var%1000)-1, CAST(CAST((@var/1000) AS NVARCHAR(100)) 
               AS DATETIME));

实时演示


1
如果dayofyear值可能少于3个符号,您可以使用CAST(SUBSTRING(@var, 5, 3) AS INT) - Smileek
@Smileek 我假设它的格式为yyyyxxx,因此是'2015023'。 - Lukasz Szozda
是的,我并不是想说你错了。只是在不同情况下需要稍作补充。 - Smileek
在将天数加到2015年1月1日之前,应该将天数减去1吗?我得到的结果是2015年8月12日,而不是原问题中建议的2015年8月11日。 - geekinit

0

既然第一个问题已经有了好的答案,那我们来谈谈第二个问题吧。

如何将DATETIME转换为这种格式?

DATENAME函数可以帮助解决它。它会看起来像这样:

SELECT DATENAME(year, @var) + RIGHT('00' + DATENAME(dayofyear, @var), 3)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接