将 INT 转换为 DATE/TIME

将 INT 转换为 DATE/TIME

我有一张表,其中将日期和时间值保存为 INT 数据类型。例如,日期存储为 YYYYMMDD,如 20110901,时间存储为 HHMMSS,如 21826。

日期接近 ISO 标准,所以问题不大,但是有人能建议一种转换为 TIME 类型的简单方法吗?我想出了一个可怕的连接、反转、子字符串、转换组合,我担心其他员工难以阅读。

答案1

您要做的就是采用“可怕的组合”并对其进行调整,以将这些整数对转换为日期时间值。然后用您能想到的尽可能多的极端情况对其进行测试,甚至可以手动根据实际数据的随机子集对其进行验证。如果您非常幸运,您将能够使用将数据显示为字符串的现有代码,并编写一个脚本,将转换代码的输出与实际输出进行比较,以确保每个实例都一致并保证完美。

代码准备就绪后,使用它一次将数据复制到您将为此目的添加到表中的新日期时间列。完成后,删除旧列并重命名新列以匹配旧名称。现在更新任何从原始列插入/更新/读取的代码以使用日期时间数据类型。然后永远不要再谈论这件事。

为了使这一切顺利进行,您需要协调运行表格调整脚本和部署新应用程序代码。如果这是一个全天候运行的应用程序,那么这可能会很棘手,但结果应该是值得的。

答案2

这是我能想到的最好的办法了。

select
-- convert string to time value
CONVERT(time
    -- insert a colon between hours and minutes (position 3)
    , STUFF(
        -- insert a colon between minutes and seconds (position 5)
        STUFF(
            -- convert to string, pad left with zeroes to 6 characters
            RIGHT('000000' + CONVERT(varchar(6), @time_value_int), 6) 
        , 5, 0, ':')
    , 3, 0, ':')
) as time_converted

我最初从数学角度开始,取整数时间值,使用整数除法和模数来获取小时、分钟和秒部分,然后乘以该时间部分的浮点数(小时= 1 / 24.0,分钟=(1 / 24.0 / 60.0),秒=(1 / 24.0 / 3600.0)然后将它们相加,结果发现无法将浮点数转换为 TIME 数据类型。它确实转换为 DATETIME,然后您可以将其转换为 TIME,但似乎精度有所损失,因此结果可能会有几毫秒的偏差。

因此文本混合方法看起来更简洁。

相关内容