我有一个表保存date和时间值为INT数据types。 例如date被存储为YYYYMMDD,如20110901,时间被存储为HHMMSS,如21826。
date接近ISO标准,所以它不是一个大问题,但任何人都可以提出一个简单的方法来转换为TIMEtypes吗? 我想出了一个可怕的连接,倒车,子串,转换等令人担忧的组合,其他员工很难读懂。
你想要做的是把你的“可怕的组合”,并适应它来将这些整数对转换为date时间值。 然后用尽可能多的边界情况来testing它,甚至可以用你的实际数据的一个随机子集来validation它。 如果您非常幸运,您可以使用现有代码将数据显示为string,然后编写一个脚本,将您的转换代码输出与实际输出进行比较,以确保每个实例都保持完美。
当代码准备就绪时,请使用它一次将数据复制到新的date时间列,您将为此添加到表中。 完成之后,删除旧列并重新命名新的名称以匹配旧名称。 现在更新插入/更新/从原始列读取使用date时间数据types的任何代码。 那就再也不说这个了。
为了使这一切顺利进行,您需要协调运行您的表格调整脚本和部署新的应用程序代码。 如果这是一个24/7的应用程序,可能会很棘手,但结果应该是值得的。
这是关于我能想出的最好的。
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),seconds =(1 / 24.0 / 3600.0)然后将它们加在一起,只是发现你不能将一个float转换为TIME数据types,它转换为DATETIME,然后你可以将其转换为TIME ,但似乎有一个精度损失,所以结果可能是几毫秒的时间。
因此,文本消除方法似乎更清晰。