SQL Server: получить данные только за последний год


Я пишу запрос, в котором я должен получить данные только за последний год. Каков наилучший способ сделать это?

SELECT ... FROM ... WHERE date > '8/27/2007 12:00:00 AM'
12 81

12 ответов:

следующее добавляет -1 лет к текущей дате:

SELECT ... From ... WHERE date > DATEADD(year,-1,GETDATE())

Я нашел эту страницу в поисках решения, которое помогло бы мне выбрать результаты из предыдущего календарного года. Большинство результатов, показанных выше, похоже, возвращают элементы из последних 365 дней, которые не работали для меня.

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

SELECT .... FROM .... WHERE year(*your date column*) = year(DATEADD(year,-1,getdate()))

спасибо те, чьи решения помогли мне прийти к тому, что мне было нужно.

Ну, я думаю, что что-то здесь не хватает. Пользователь хочет получить данные за последний год, а не за последние 365 дней. Существует огромная разница. На мой взгляд, данные за последний год-это все данные за 2007 год (если я сейчас в 2008 году). Так что правильный ответ будет:

SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE) - 1

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

SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE) - 1 AND DATE > '05/05/2007'

найдите dateadd в BOL

dateadd(yy,-1,getdate())

самый читаемый, IMO:

SELECT * FROM TABLE WHERE Date >
   DATEADD(yy, -1, CONVERT(datetime, CONVERT(varchar, GETDATE(), 101)))

которых:

  1. получает теперь datetime GETDATE () = #8/27/2008 10: 23am#
  2. преобразуется в строку с форматом 101 конвертировать(varchar, #8/27/2008 10:23am#, 101) = '8/27/2007'
  3. преобразование в datetime конвертировать(дата и время, '8/27/2007') = #8/27/2008 12:00 утра#
  4. вычитает 1 год DATEADD(yy, -1, #8/27/2008 12: 00AM#) = #8/27/2007 12:00УТРА#

есть варианты с DATEDIFF и DATEADD, чтобы получить вас в полночь сегодня, но они, как правило, довольно тупые (хотя и немного лучше по производительности - не то, что вы заметили бы по сравнению с чтениями, необходимыми для извлечения данных).

GETDATE () возвращает текущую дату и время.

Если в прошлом году начинается в полночь текущего дня в прошлом году (как в исходном примере), вы должны использовать что-то вроде:

DECLARE @start datetime
SET @start = dbo.getdatewithouttime(DATEADD(year, -1, GETDATE())) -- cut time (hours, minutes, ect.) --  getdatewithouttime() function doesn't exist in MS SQL -- you have to write one
SELECT column1, column2, ..., columnN FROM table WHERE date >= @start

другие предложения хороши, если у вас есть "только SQL".

однако я предполагаю, что - если это возможно - вы вычисляете дату в своей программе и вставляете ее как строку в SQL-запрос.

по крайней мере для больших таблиц (т. е. несколько миллионов строк, возможно, в сочетании с объединениями), что даст вам значительное улучшение скорости, поскольку оптимизатор может работать с этим намного лучше.

аргумент для функции DATEADD:

DATEADD (*datepart* , *number* , *date* )

datepart можно: гг, КК, мм, ду, ДД, шк, ДГ, ДХ, Ин, СС, МС

- это выражение, которое может быть разрешено в int, который добавляется к datepart даты

дата - это выражение, которое может быть разрешено до значения time, date, smalldatetime, datetime, datetime2 или datetimeoffset.

declare @iMonth int
declare @sYear varchar(4)
declare @sMonth varchar(2)
set @iMonth = 0
while @iMonth > -12
begin
    set @sYear = year(DATEADD(month,@iMonth,GETDATE()))
    set @sMonth = right('0'+cast(month(DATEADD(month,@iMonth,GETDATE())) as varchar(2)),2)
    select @sYear + @sMonth
    set @iMonth = @iMonth - 1
end

Я, как и @D. E. White, пришел сюда по аналогичным, но другим причинам, чем исходный вопрос. Оригинальный вопрос за последние 365 дней. ответ @ samjudson предусматривает это. Ответ @D. E. White возвращает результаты за предыдущий календарный год.

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

SELECT .... FROM .... WHERE year(date) > year(DATEADD(year, -2, GETDATE()))

например, 17 февраля 2017 г. этот запрос возвращает результаты 1/1/2016 - 2/17/2017

У меня была аналогичная проблема, но предыдущий кодер только предоставил дату в формате mm-yyyy. Мое решение простое, но может оказаться полезным для некоторых (я также хотел убедиться, что начальные и конечные пробелы были исключены):

SELECT ... FROM ....WHERE 
CONVERT(datetime,REPLACE(LEFT(LTRIM([MoYr]),2),'-
','')+'/01/'+RIGHT(RTRIM([MoYr]),4)) >=  DATEADD(year,-1,GETDATE())

где дата > DATE_SUB (сейчас (), интервал 1 год)

Это даст вам запрос, который будет тянуть 1 год данных, когда вы запустите его.