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

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

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

person Josh Mein    schedule 27.08.2008    source источник


Ответы (12)


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

SELECT ... From ... WHERE date > DATEADD(year,-1,GETDATE())
person samjudson    schedule 27.08.2008
comment
Ваш чище, но вот что у меня было: ГОД (GETDATE ()) - 1 - person PCPGMR; 21.01.2015
comment
Это возвращает вам число, а не дату, вы не могли бы затем сравнить это с датой, не вычислив также год этой даты. Тогда это вернет неверные результаты за 31 декабря 2014 года по сравнению с 1 января 2015 года, которые относятся к разным годам, но не с разницей в год ... - person samjudson; 22.01.2015
comment
верный. Мне нужно было сравнить годы по количеству лет, поэтому, например, с 2013 по 2014 год, поскольку поступающие данные содержат только год. Я был неясен в своем комментарии. Спасибо - person PCPGMR; 23.01.2015
comment
Я получил сообщение об ошибке при выполнении этого запроса ... FUNCTION DatabaseName.DATEADD не существует. Есть предложения? - person Marcello Perri; 17.01.2019

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

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

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

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

person D.E. White    schedule 18.04.2013

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

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

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

SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1 AND DATE > '05/05/2007'
person Ivan Bosnic    schedule 27.08.2008
comment
Это будет иметь очень плохую производительность для больших таблиц, вы будете перебирать каждую запись, чтобы оценить годовое значение даты, было бы лучше использовать диапазон дат - person Adriaan Davel; 30.05.2012
comment
@ Адриан Давел. Как бы вы написали это с указателем даты? - person Kasper; 02.02.2021

Искать датудобавить в BOL

dateadd(yy,-1,getdate())
person SQLMenace    schedule 27.08.2008

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

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

Который:

  1. Получает текущую дату и время GETDATE () = # 27.08.2008 10:23 am#
  2. Преобразует в строку формата 101 CONVERT (varchar, # 27.08.2008 10:23 am#, 101) = '27.08.2007'
  3. Преобразует в datetime CONVERT (datetime, '27.08.2007') = # 27.08.2008 12:00 AM#
  4. Вычитает 1 год DATEADD (yy, -1, # 27.08.2008 12:00 AM#) = # 27.08.2007 12:00 AM#

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

person Mark Brackett    schedule 27.08.2008

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
person Grzegorz Gierlik    schedule 27.08.2008

По какой-то причине ни один из приведенных выше результатов у меня не сработал.

Это выбирает последние 365 дней.

 SELECT ... From ... WHERE date BETWEEN CURDATE() - INTERVAL 1 YEAR AND CURDATE()
person Connor    schedule 08.01.2020
comment
было бы хорошо, если бы вы могли добавить версию сервера MSSQL, для которой это работает. - person itwasntme; 08.01.2020

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

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

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

person BlaM    schedule 27.08.2008
comment
Было бы лучше, если бы вы создали параметризованную строку и избегали размещения значения в самой строке ... - person Adriaan Davel; 30.05.2012

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

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

datepart может быть: yy, qq, mm, dy, dd, wk, dw, hh, mi, ss, ms.

number - это выражение, которое может быть преобразовано в int, которое добавляется к datepart of date.

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

person imtheref    schedule 21.09.2011

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

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

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

Например, 17 февраля 2017 г. этот запрос возвращает результаты с 01.01.2016 по 17.02.2017.

person kevinaskevin    schedule 17.02.2017

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

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

person    schedule
comment
Это не решает вопрос. - person Nathan Skerl; 18.05.2012
comment
Кроме того, в то время как циклы обычно плохо подходят для SQL - person StingyJack; 04.06.2012