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

StackOverflow https://stackoverflow.com/questions/30222

  •  09-06-2019
  •  | 
  •  

Вопрос

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

SELECT ... FROM ... WHERE date > '8/27/2007 12:00:00 AM'
Это было полезно?

Решение

Следующее добавляет -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())

Самый читабельный, ИМХО:

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#, 101) = '27.08.2007'
  3. Преобразуется в дату и время CONVERT(дата-время, '27.08.2007') = #27.08.2008 00:00#
  4. Вычитает 1 год DATEADD(гг, -1, #27.08.2008 00:00#) = #27.08.2007 00: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* )

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

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

дата — это выражение, которое можно преобразовать в значение времени, даты, 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.Уайт пришел сюда по тем же причинам, что и исходный вопрос, но по другим причинам.Исходный вопрос запрашивает последние 365 дней.Ответ @samjudson обеспечивает это.@Д.Э.Ответ Уайта возвращает результаты за предыдущий календарный год.

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

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

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

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

SELECT ... FROM ....WHERE 
CONVERT(datetime,REPLACE(LEFT(LTRIM([MoYr]),2),'-
','')+'/01/'+RIGHT(RTRIM([MoYr]),4)) >=  DATEADD(year,-1,GETDATE())
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top