Больше предупреждения, чем вопроса:
Мы решили очень странную ошибку этим утром.У нас есть множество отчетов, которые позволяют пользователям вводить диапазоны дат, которые они хотят запустить.Предполагается, что если вы запрашиваете отчет с 1 августа 2010 года по 8 октября 2010 года, вы намеревались включить , включая 8 октября 2010 года, поэтому дата окончания отчета не будет 8 /10, это что-то после этого.
Это не может быть 8/11/2010, потому что некоторые из этих отчетов объединяют все, что происходило в течение дня, группируя их по тому дню, который наступает в полночь, поэтому ежедневный свод был бывключать дополнительный день - не то, что мы хотели.
Чтобы избежать возможности пропустить какие-либо предметы очень близко к концу дня, мы вычислили дату окончания как «на один тик» меньше, чем завтра:
public static DateTime EndOfDay(DateTime day)
{
return day.Date.AddDays(1).AddTicks(-1);
}
Внутренне это заканчивается примерно 10/10/2010 12: 59: 59.9999PM
Что ж, когда вы передаете этот DateTime параметру DATETIME в SQL Server, он округляет значение до8/11/2010 00:00:00!И так как в нашем запросе вместо
DateField >= @FromDate AND DateField < @ToDate
используется
DateField BETWEEN @FromDate AND @ToDate
Мы видели отчеты от 8/1 / 2010-8 / 10/2010, включающие элементы от 8/11/2010.
Единственный способ, которым мы обнаружили настоящую проблему, - это циклическое переключение дат через строку.DateTime.ToString () тоже округляется, поэтому мы должны получить 01.08.2010 12:59:59 PM, которой SQL Server был доволен.
Так что теперь наш метод «конец дня» выглядит следующим образом:
public static DateTime EndOfDay(DateTime day)
{
// Cant' subtract anything smaller (like a tick) because SQL Server rounds UP! Nice, eh?
return day.Date.AddDays(1).AddSeconds(-1);
}
Извините, не вопрос - просто подумал, что кто-то может найти это полезным.