SQL Server 2008 R2-将所有DateTime Parts(AS INT)转换为DateTime列



我有一张桌子,上面有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个,从几天开始。

最新更新