我有一张桌子,上面有DateTime作品(年,月,每日,小时,分钟,第二,毫秒)作为整数存储。我想将它们加入到一个datetime
列中。
我尝试了各种方法,但没有工作 - 似乎没有简单的方法将这些项目放在一起?
您可以将每个部分转换为varchar,并以ISO DateTime字符串的格式将它们连接在一起。然后使用转换将字符串转换为日期。
这是一个示例。您需要用表中的列名称替换每个硬编码的整数。
SELECT CONVERT(DATETIME, CAST(2016 AS VARCHAR(4)) -- year
+ '-' + CAST('0' + CAST(8 AS VARCHAR(2)) AS VARCHAR(2)) -- month
+ '-' + RIGHT('0' + CAST(13 AS VARCHAR(2)), 2) -- day of month
+ 'T' + RIGHT('0' + CAST(16 AS VARCHAR(2)), 2) -- hours (I assume its military time (24 hours))
+ ':' + RIGHT('0' + CAST(32 AS VARCHAR(2)), 2) -- minutes
+ ':' + RIGHT('0' + CAST(07 AS VARCHAR(2)), 2) -- seconds
+ '.' + RIGHT('000' + CAST(64 AS VARCHAR(3)), 3)) AS MyDate -- milliseconds
FROM yourTable
或列名称(假设)
SELECT CONVERT(DATETIME, CAST(yt.Year AS VARCHAR(4)) -- year
+ '-' + CAST('0' + CAST(yt.Month AS VARCHAR(2)) AS VARCHAR(2)) -- month
+ '-' + RIGHT('0' + CAST(yt.Day AS VARCHAR(2)), 2) -- day of month
+ 'T' + RIGHT('0' + CAST(yt.Hours AS VARCHAR(2)), 2) -- hours (I assume its military time (24 hours))
+ ':' + RIGHT('0' + CAST(yt.Minutes AS VARCHAR(2)), 2) -- minutes
+ ':' + RIGHT('0' + CAST(yt.Seconds AS VARCHAR(2)), 2) -- seconds
+ '.' + RIGHT('000' + CAST(yt.Milliseconds AS VARCHAR(3)), 3)) AS MyDate -- milliseconds
FROM yourTable yt
另外一个说明。Microsoft建议您使用DateTime2而不是DateTime来持续以SQL Server 2008开头的日期时间值(您在问题中标记了)。
在SQL Server 2012之前,您可以使用一系列嵌套的DATEADD()
函数来模拟DATETIMEFROMPARTS()
函数
创建和填充示例数据(在下一个问题中,请在此步骤中保存我们)
DECLARE @T as table
(
cYear int,
cMonth int,
cDay int,
cHour int,
cMinute int,
cSecond int,
cMillisecond int
)
INSERT INTO @T VALUES(2016, 6, 22, 16, 34, 25, 3)
查询:
SELECT *,
DATEADD(MILLISECOND, cMillisecond,
DATEADD(SECOND, cSecond,
DATEADD(MINUTE, cMinute,
DATEADD(HOUR, cHour,
DATEADD(DAY, cDay -1,
DATEADD(MONTH, cMonth - 1,
DATEADD(YEAR, cYear - 2000, '2000-01-01')
)
)
)
)
)
) As TheDate
FROM @T
结果:
cYear cMonth cDay cHour cMinute cSecond cMillisecond TheDate
----- ------ ---- ----- ------- ------- ------------- -----------------------
2016 6 22 16 34 25 3 2016-06-22 16:34:25.003
请注意,我使用的基本日期是2000年1月1日,因此您需要从年度减去2000年,从月份开始1个,从几天开始。