Правильный способ сравнения коротких дат (SQL Server 2005) - PullRequest
1 голос
/ 24 мая 2011

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

CONVERT(datetime,CONVERT(VARCHAR(10), return_date,101)) = '{0}'

Мой руководитель говорит, что я должен сделать это следующим образом:

datepart(month,return_date)= 5   
and  datepart(day,return_date)=24   
and  datepart(year,return_date)=2011 

, поскольку определенное значение 101 распознаетсяфункция CONVERT может измениться в будущем.Это правда?Как часто меняются значения этих параметров?Изменились ли в прошлом?Есть ли еще лучший способ сравнить краткую форму дат?

Ответы [ 3 ]

3 голосов
/ 24 мая 2011

Если под «короткими датами» вы подразумеваете «просто дату без времени»

Select ...
From MyTable
Where return_date >= '20110524'
    And return_date < DateAdd(d, 1, '20110524')

Во-первых, обратите внимание на < во второй части предложения Where. Во-вторых, если на return_date есть индекс, этот подход будет его использовать. Другое решение, которое не будет использовать индекс (и, следовательно, приведет к сканированию таблицы), будет:

Select ...
From MyTable
Where DateAdd(d, DateDiff(d, 0, return_date), 0) = '20110524'

Если return_date всегда хранится без его компонента времени (т. Е. Его компонент времени всегда полночь), тогда вы можете сделать простое сравнение:

Select ...
From MyTable
Where return_date = '20110524'
1 голос
/ 24 мая 2011

За исключением добавления стилей преобразования, convert() и его стили преобразования не изменились с SQL Server 4.2, c. 1992, когда он был в комплекте с OS / 2.

0 голосов
/ 24 мая 2011

Это мои предпочтения:

SELECT foo
FROM bar
WHERE return_date = CONVERT(datetime, FLOOR(CONVERT(float, Getdate())))

или, если return_date имеет метку времени

SELECT foo
FROM bar
WHERE CONVERT(datetime, FLOOR(CONVERT(float, return_date))) = CONVERT(datetime, FLOOR(CONVERT(float, Getdate())))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...