Мне дали таблицу с более чем 2 миллиардами строк. Он имеет поле для введенного времени, но создатель таблицы сделал это поле строковым полем. Он также не соответствует нормальным соглашениям о сроках времени.
Мне было поручено создать новое поле, которое является полем типа даты и времени, содержащим одно и то же время, но преобразованным в надлежащий формат, чтобы на нем могли выполняться запросы.
В настоящее время я написал консольное приложение на С#, которое ВЫБИРАЕТ верхние 100000 строк, которые еще не были обновлены, а строка за строкой преобразует строку в определенное время. Затем он обновляет каждую из строк.
Этот процесс работает, но он медленный, и время имеет значение. Я могу запускать несколько копий своей программы и пытаюсь придумать решение, чтобы как-то запустить программу несколько раз и убедиться, что каждая копия программы обновляет разные строки.
Идеи до сих пор:
Может ли кто-нибудь предложить лучшее предложение? Улучшить одну из моих?
Благодарю.
UPDATE: пример моей текущей временной строки - 12/ноябрь/2014: 08: 52: 22, и ее нужно преобразовать в 2014-11-12 08:42:22
Итак, вот мое решение, я понятия не имею, насколько эффективен для строк 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)),'/',' ')
заменяет символы "/" с даты и возвращает 12 ноября 2014 года
SUBSTRING(@string,CHARINDEX ( ':' ,@string , 0)+1,LEN(@string)),120)
получите время без ":" между датой и временем от вашей начальной строки.
Наконец, добавлено пространство между этими двумя строковыми манипуляциями и преобразовано в datetime.
Выход для запроса выше: '2014-11-12 08: 52: 22.000'
Используйте 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();
}
Просто делайте это внутри SQL вместо того, чтобы читать всю базу данных и работать с ней.
используйте следующее:
UPDATE <TableName>
SET <dateTime-Date> = CONVERT(datetime, <string-Date>)
проверьте этот сайт для любых спецификаций формата, которые вам бы хотелось: SQL Datetime Conversion