Оператор BETWEEN является включающим, поэтому вы видите результаты, полученные в первом запросе. Округление, которое вы видите во втором запросе, будет зависеть от того, какой именно тип данных datetime вы используете в своей таблице. (Кстати, я думаю, вы путаете секунды с сотыми долями секунды). Похоже, вы используете в таблице smalldatetime, в этом случае время округляется до ближайшей минуты.
Если ваша таблица использует datetime, попробуйте явно преобразовать значения @startDate и @endDate в значения DATETIME (CAST (@endDate AS DATETIME)).
Краткое примечание ... даже для значений DATETIME SQL Server имеет точность только до 1/100 секунды, поэтому 11: 59: 59.999 округляется до 12: 00: 00.000.
У вас есть три варианта:
1) МЕЖДУ CAST ('01 / 01/2008 00: 00.000 'КАК DATETIME) И CAST ('03 / 31/2008 12: 59: 59.997' AS DATETIME)
2) ГОД (my_date) = 2008 И МЕСЯЦ (my_date) МЕЖДУ 1 И 3
3) my_date> = CAST ('01 / 01/2008 00: 00.000 'как дата) и my_date
Первый метод не очень интуитивен и на мой взгляд подвержен ошибкам. Второй метод убивает производительность, так как индексы не могут быть использованы, и он становится намного более сложным, если у вас могут быть поиски, которые охватывают годы или начинаются / заканчиваются в середине месяцев. Третий метод, предложенный Роуландом, является лучшим, на мой взгляд.