Сравнение РАВНЫХ значений SQL и SQLite DateTime приводит к ложному C#

#c# #sql-server #sqlite #datetime #uwp

#c# #sql-server #sqlite #datetime #uwp

Вопрос:

Я создаю запись SQLite с DateTime.UtcNow.

Затем я преобразую DateTime следующим образом:

 var format = "yyyy-MM-ddTHH:mm:ss:fff";

var ModifiedString = _object.Modified.ToString(format);
var ModifiedFormatted = DateTime.ParseExact(ModifiedString, format, CultureInfo.InvariantCulture);
  

Это значение вставляется в SQL вместе с данными другой записи:

 sqlCmd.Parameters.Add("@Modified", System.Data.SqlDbType.DateTime2).Value = ModifiedFormatted;
  

Затем я запрашиваю запись и снова сравниваю SQLite с SQL, чтобы проверить, совпадает ли значение DateTime (для тестирования оно одинаковое). Я получаю результат, в котором значения не равны:

Я использую Select * Из TableName и:

 _dbobject.Modified = Convert.ToDateTime(dr["Modified"]);
  

Сравнение выполняется просто следующим образом:

 if (_object.Modified < _dbobject.Modified) 
{
    //update local
} else if (_object.Modified > _dbobject.Modified)
{
    //update online
} else
{
    //do nothing
}
  

Локальные или онлайновые записи не были изменены за это время, но это всегда приводит к тому, что локальные находятся>, чем онлайн.

Я что-то упускаю?

Комментарии:

1. «Затем я запрашиваю запись и снова сравниваю SQLite с SQL» Я предполагаю, что если вы говорите, "SQL" я предполагаю, что вы имеете в виду SQL Server (MSSQL), а не MySQL?

2. Да, я ввел это неправильно

3. Также вы должны использовать DateTime. Compare() а не «простые» операторы сравнения для сравнения строк datetime.. Поскольку это должно быть более безопасным.

4. Почему вы конвертируете _object.Modified в первую очередь?

5. о, я этого не понимаю. Я сразу же попробую

Ответ №1:

Хорошо, значит, это произошло из-за миллисекундной точности между DateTime и DateTime2, где DateTime2 имеет более 3 позиций после секунды, и во время преобразования в DateTime оно округлялось вверх / вниз, что приводило к неравенству значений.

Я обрезал две даты на:

 DateTime date1 = _object.Modified.AddTicks(-_object.Modified.Ticks % TimeSpan.TicksPerSecond);
  

и то же самое для другой даты.

Я не могу привести более точный результат, чем этот, поэтому я в порядке. Однако не все были бы удовлетворены.