Странное поведение datetime в SQL Server

 declare @data datetime
 set @data = '2011-01-01 23:59:59:999'
 select @data  

результат:

 2011-01-02 00:00:00.000

Второй пример:

 declare @data datetime
 set @data = '2011-01-01 23:59:59:999'
 select 1 where @data >= '2011-01-02 00:00:00:000'

Результат

 1

Мой вопрос - почему и как сделать его правильным?

Изменить

проблема в SQL Server 2008

Ответ 1

У вас проблема с точностью..999 округляется до 0,000.

.997 как можно ближе к следующему дню.

declare @data datetime
set @data = '2011-01-01T23:59:59.997'
select @data  

Посмотрите здесь, в разделе "Округление datetime Fractional Second Precision" http://msdn.microsoft.com/en-us/library/ms187819.aspx

Если вы находитесь на SQL Server 2008, вы можете использовать datetime2 (3), если вам нужна точность до миллисекунды.

Ответ 2

Вам нужно использовать более точный формат - datetime2 (ГГГГ-ММ-ДД ЧЧ: ММ: СС: XXXXXXX)

 declare @data datetime2
 set @data = '2011-01-01 23:59:59:999'
 select 1 where @data >= '2011-01-02 00:00:00:000'