Вопрос о функции DateAdd и информации - PullRequest
4 голосов
/ 12 апреля 2011

Я сейчас пишу немного SQL и натолкнулся на странную проблему.

Код, который я использую:

select * from #table1
where datefield = DATEADD(day, -2, getdate())

Проблема, с которой я сталкиваюсь, заключается в том, что она не будет получать такую ​​информацию. Если я добавлю «>» к «=», он получит информацию. Если я поставлю точную дату в запросе вместо части 'dateadd', она получит правильные записи.

Я протестировал параметры даты, и есть соответствующие записи за 4/10/2011. Но по какой-то причине ему просто не нравится '= dateadd' в этом случае.

Я также пытался использовать строку 'current_timestamp' вместо 'getdate' с теми же результатами.

Есть предложения?

Ответы [ 3 ]

3 голосов
/ 12 апреля 2011

DATEADD(day, -2, getdate()) также возвращает компонент времени, что-то вроде 2011-04-10 16:35:23.437

Вы можете использовать DATEADD(dd, 0, DATEDIFF(dd, 0, DATEADD(day, -2, getdate()))), чтобы получить только часть даты, если версия Sql Server меньше 2008 (когда был добавлен тип DATE)

2 голосов
/ 12 апреля 2011

getdate() является 1/300 с точностью до секунды.Вы запрашиваете точное время вплоть до (почти) миллисекунд.

Если ваше поле даты имеет значение DATETIME, но без фактических частей времени, используйте это:

SELECT  *
FROM    #table1
WHERE   datefield = DATEADD(day, -2, CAST(getdate() AS DATE))

или, лучше, это:

SELECT  *
FROM    #table1
WHERE   datefield >= DATEADD(day, -2, CAST(getdate() AS DATE))
        AND datefield < DATEADD(day, -1, CAST(getdate() AS DATE))

Последний запрос вернет вам все записи за дату (даже с установленной временной частью).

1 голос
/ 12 апреля 2011

Getdate() возвращает Datetime, который включает часть времени.Я предполагаю, что вы совпадаете только с датой.Попробуйте:

where datefield = CAST(DATEADD(day, -2, getdate())) as DATE)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...