我获得了一张超过20亿行的表格。它有一个输入时间的字段,但表的创建者使该字段成为字符串字段。它也不遵循正常的日期时间约定。
我的任务是创建一个新字段,该字段是一个日期时间类型字段,包含相同的时间但转换为适当的格式,以便可以在其上运行查询。
目前我编写了一个C#控制台应用程序,它选择尚未更新的前100000行,并逐行将字符串转换为时间。然后它会更新每一行。
这个过程有效,但速度慢,时间紧迫。我可以运行我的程序的多个副本,并试图想出一个解决方案,以某种方式运行程序多次,并确保程序的每个副本更新不同的行。
到目前为止的想法:
任何人都可以提供更好的建议吗?改进我的一个?
感谢。
更新:我现有时间字符串的示例是2014年11月12日:08:52:22,需要转换为2014-11-12 08:42:22
答案 0 :(得分:2)
使用LINQ to SQL,一次只提取一定数量的记录。
您的代码看起来像这样:
using (var db = new MyDbContext())
{
var results = db.GetResultsFromDatabase();
int take = 100;
int processed = 0;
while(processed < results.Count())
{
var set = results.Skip(processed).Take(take);
set.ForEach(s => {
// update the date
}
processed += take;
}
db.SubmitChanges();
}
答案 1 :(得分:1)
只需在SQL中执行此操作,而不是读取整个数据库并进行操作。
使用以下内容:
UPDATE <TableName>
SET <dateTime-Date> = CONVERT(datetime, <string-Date>)
检查此网站是否有您想要的任何格式规范: SQL Datetime Conversion
答案 2 :(得分:1)
所以这是我的解决方案,我不知道2mil行的效果如何,以防你想在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)
从初始字符串中获取日期和时间之间没有“:”的时间。
最后在这两个字符串操作之间添加了一个空格,并将其转换为datetime。
上述查询的输出:'2014-11-12 08:52:22.000'