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

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

SELECT ... FROM ... WHERE date > '8/27/2007 12:00:00 AM'
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
107
0
306 792
12
Перейти к ответу Данный вопрос помечен как решенный

Ответы 12

Ответ принят как подходящий

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

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

Ваш чище, но вот что у меня было: ГОД (GETDATE ()) - 1

PCPGMR 21.01.2015 20:17

Это возвращает вам число, а не дату, вы не могли бы сравнить это с датой, не вычислив также год этой даты. Тогда это вернет неверные результаты за 31 декабря 2014 года по сравнению с 1 января 2015 года, которые относятся к разным годам, но не через год ...

samjudson 22.01.2015 13:35

правильный. Мне нужно было сравнить годы по количеству лет, поэтому, например, с 2013 по 2014 год, поскольку поступающие данные содержат только год. Я был неясен в своем комментарии. Спасибо

PCPGMR 23.01.2015 18:51

Я получил сообщение об ошибке при выполнении этого запроса ... "FUNCTION DatabaseName.DATEADD не существует" Есть предложения?

Marcello Perri 17.01.2019 13:43

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

dateadd(yy,-1,getdate())

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

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

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

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

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

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

Adriaan Davel 30.05.2012 19:43

@ Адриан Давел. Как бы вы написали это с daterange?

Kasper 02.02.2021 13:15

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

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

Который:

  1. Получает дату и время GETDATE () = # 27.08.2008 10:23 утра#
  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, чтобы получить вам полночь сегодня, но они, как правило, довольно тупые (хотя немного лучше по производительности - не то, чтобы вы заметили по сравнению с чтениями, необходимыми для выборки данных).

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

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

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

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

Adriaan Davel 30.05.2012 19:41

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

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

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

номер - это выражение, которое может быть разрешено в int, которое добавляется к datepart of 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

Это не решает вопрос.

Nathan Skerl 18.05.2012 22:19

Кроме того, в то время как циклы обычно плохи для SQL

StingyJack 04.06.2012 17:48

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

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

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

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

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

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

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

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

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

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

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

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

 SELECT ... From ... WHERE date BETWEEN CURDATE() - INTERVAL 1 YEAR AND CURDATE()

было бы хорошо, если бы вы могли добавить версию сервера MSSQL, для которой это работает.

itwasntme 08.01.2020 05:15

Другие вопросы по теме