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

sql sql-server database tsql

197964 просмотра

11 ответа

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

SELECT ... FROM ... WHERE date > '8/27/2007 12:00:00 AM'
Автор: Josh Mein Источник Размещён: 17.05.2019 03:44

Ответы (11)


168 плюса

Решение

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

SELECT ... From ... WHERE date > DATEADD(year,-1,GETDATE())
Автор: samjudson Размещён: 27.08.2008 02:12

9 плюса

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

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

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

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

Автор: D.E. White Размещён: 18.04.2013 06:34

5 плюса

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

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

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

SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1 AND DATE > '05/05/2007'
Автор: Ivan Bosnic Размещён: 27.08.2008 02:23

4 плюса

Найдите дату в BOL

dateadd(yy,-1,getdate())
Автор: SQLMenace Размещён: 27.08.2008 02:12

4 плюса

Наиболее читаемый, ИМО:

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 (datetime, '8/27/2007') = # 8/27/2008 12:00 AM#
  4. Вычитает 1 год DATEADD (yy, -1, # 8/27/2008 12:00 AM#) = # 8/27/2007 12:00 AM#

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

Автор: Mark Brackett Размещён: 27.08.2008 02:26

2 плюса

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
Автор: Grzegorz Gierlik Размещён: 27.08.2008 02:20

0 плюса

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

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

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

Автор: BlaM Размещён: 27.08.2008 03:13

0 плюса

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

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

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

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

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

Автор: imtheref Размещён: 21.09.2011 02:29

0 плюса

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
Автор: Tony Размещён: 18.05.2012 05:58

0 плюса

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

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

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

Например, 17 февраля 2017 года этот запрос возвращает результаты с 01.01.2006 по 2/17/2017

Автор: kevinaskevin Размещён: 17.02.2017 06:49

0 плюса

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

SELECT ... FROM ....WHERE 
CONVERT(datetime,REPLACE(LEFT(LTRIM([MoYr]),2),'-
','')+'/01/'+RIGHT(RTRIM([MoYr]),4)) >=  DATEADD(year,-1,GETDATE())
Автор: Rick Savoy Размещён: 15.11.2017 05:47
32x32