T-SQL запрос, чтобы получить дату +30 дней с сегодняшнего дня точно - PullRequest
0 голосов
/ 04 июля 2019

Данные представлены в формате даты / времени, и я пытаюсь получить список строк с точной датой в течение 30 дней с сегодняшнего дня.Это основано на SQL Server 2005.

Итак, 1 июля я бы получил список строк, где дата - 1 августа.

Примером записи будет:

Воскресенье, 4 июля 1993 г., 12:00 AM

Однако мой запрос не возвращает никаких строквообще по какой-то причине.

AND DATEPART("month", a.PersonBirthdate) = DATEPART("month", GetDate())
AND DATEPART("day", a.PersonBirthdate) = DATEPART("day", GetDate()+30)

Например, приведенная ниже часть запроса работает нормально, чтобы получить список строк, в которых указана дата сегодня:

AND DATEPART("month", a.PersonBirthdate) = DATEPART("month", GetDate())
AND DATEPART("day", a.PersonBirthdate) = DATEPART("day", GetDate())

Ответы [ 2 ]

2 голосов
/ 04 июля 2019

Для вычисления сегодня плюс 30 дней как Date вы можете использовать:

DateAdd( day, 30, Cast( GetDate() as Date ) )

Обратите внимание, что если вы пытаетесь получить строки по столбцу DateTime, которые имеют эту дату, вы должны использовать:

where DateAdd( day, 30, Cast( GetDate() as Date ) ) <= DateTimeColumn and
  DateTimeColumn < DateAdd( day, 31, Cast( GetDate() as Date ) )

Это будет включать все время вплоть до полуночи, начинающейся на следующий день, но не включая ее.Условие SARGABLE , чтобы оно могло использовать индексы.

1 голос
/ 04 июля 2019

Я создал UDF несколько лет назад под названием GetJustDate, который возвращает только дату и удаляет все часы / минуты / секунды / и т. Д.

ALTER FUNCTION [dbo].[GetJustDate] (@DATE datetime)
RETURNS datetime AS  
BEGIN 
    RETURN DATEADD(dd, 0, DATEDIFF(dd, 0, @DATE))
END

Если вы используете это и добавляете 30 дней кэто, вы получите только дату в будущем, которую вы хотите сопоставить ...

DECLARE @FUTURE DATETIME = DATEADD(d, 30, dbo.GetJustDate(@DATE))

Как только у вас есть это, вы можете сравнить дату в строке (после получения только даты) сновая переменная ...

AND dbo.GetJustDate(a.PersonBirthdate) = @FUTURE

В качестве альтернативы, если вы не хотите использовать UDF, просто используйте DATEADD / DATEDIFF напрямую ...

DECLARE @FUTURE DATETIME = DATEADD(dd, 30, DATEDIFF(dd, 0, @DATE))
AND DATEADD(dd, 0, DATEDIFF(dd, 0, a.PersonBirthdate)) = @FUTURE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...