SQL Server: получать данные только за прошедший год - PullRequest
91 голосов
/ 27 августа 2008

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

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

Ответы [ 11 ]

181 голосов
/ 27 августа 2008

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

SELECT ... From ... WHERE date > DATEADD(year,-1,GETDATE())
10 голосов
/ 18 апреля 2013

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

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

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

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

6 голосов
/ 27 августа 2008

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

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

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

SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1 AND DATE > '05/05/2007'
4 голосов
/ 27 августа 2008

Наиболее читабельно, ИМО:

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

Что:

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

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

4 голосов
/ 27 августа 2008

Поиск даты в BOL

dateadd(yy,-1,getdate())
2 голосов
/ 27 августа 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
0 голосов
/ 15 ноября 2017

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

SELECT ... FROM ....WHERE 
CONVERT(datetime,REPLACE(LEFT(LTRIM([MoYr]),2),'-
','')+'/01/'+RIGHT(RTRIM([MoYr]),4)) >=  DATEADD(year,-1,GETDATE())
0 голосов
/ 17 февраля 2017

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

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

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

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

0 голосов
/ 18 мая 2012
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
0 голосов
/ 21 сентября 2011

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

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

datepart может быть: гг, кв, мм, гг, дд, дд, нед, чч, чч, ми, сс, мс

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

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

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