我得到的表中有超过20亿行。它有一个用于输入时间的字段,但是表的创建者将此字段设为字符串字段。它还不遵循正常的日期时间约定。
我的任务是创建一个新字段,该字段是一个包含相同时间但转换为正确格式的datetime类型字段,以便可以在其上运行查询。
目前,我已经编写了一个C#控制台应用程序,该应用程序选择尚未更新的前100000行,并且逐行将字符串转换为时间。然后,它更新每一行。
此过程有效,但速度很慢,时间至关重要。我可以运行我的程序的多个副本,并试图提出一种解决方案以某种方式多次运行该程序,并确保该程序的每个副本都在更新不同的行。
到目前为止的想法:
而不是选择前100000行,而是选择1000000个随机行。 (可能有一些重叠,但可以完成工作)
该表有一个ID字段。我可以选择一个程序,其中id模2 == 0,另一个程序id%2!= 0(对于素数等,可以继续)
仅在为我正在运行的程序的每个副本指定的id范围内获取行
添加一个锁定列以告知我的程序某个字段当前处于锁定状态(这表示该字段正在处理中)
谁能提供更好的建议?改善我的一个?
谢谢。
更新:我现有的时间字符串的示例是12 / Nov / 2014:08:52:22,需要将其转换为2014-11-12 08:42:22
最佳答案
所以这是我的解决方案,我不知道对于200万行,如果要在SQL中执行,效果如何。
Declare @string varchar(50) = '12/Nov/2014:08:52:22'
SELECT CONVERT(datetime,REPLACE(SUBSTRING(@string,0,CHARINDEX ( ':' ,@string , 0)),'/',' ')
+' '+
SUBSTRING(@string,CHARINDEX ( ':' ,@string , 0)+1,LEN(@string)),120)
让我为您解释一下代码
REPLACE(SUBSTRING(@string,0,CHARINDEX ( ':' ,@string , 0)),'/',' ')
从日期开始替换“ /”字符并返回2014年11月12日
SUBSTRING(@string,CHARINDEX ( ':' ,@string , 0)+1,LEN(@string)),120)
从您的初始字符串中获取日期和时间之间没有“:”的时间。
最后,在这两个字符串操作之间添加了一个空格,并将其转换为日期时间。
以上查询的输出:'2014-11-12 08:52:22.000'
关于c# - 如何使用C#程序中的新值快速更新表中的所有行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26781133/