SQL Server: отримуйте дані лише за минулий рік


98

Я пишу запит, в якому мені потрібно отримати дані лише за останній рік. Який найкращий спосіб зробити це?

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

Відповіді:


196

Далі додано -1 рік до поточної дати:

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

1
З
вами

2
Це повертає вам число, а не дату, ви не зможете порівняти його з датою, не розраховуючи також рік цієї дати. Потім це призведе до невірних результатів за 31 грудня 2014 р. Проти 1 січня 2015 р. - які є різними роками, але не один рік ...
samjudson

правильно. Мені потрібно було порівняти роки за кількістю років, тому, наприклад, 2013-2014 рр., Оскільки дані, що надходять лише, мали рік. У своєму коментарі мені було не ясно. Дякую
PCPGMR

Я отримав повідомлення про помилку під час виконання цього запиту ... "FUNCTION DatabaseName.DATEADD не існує" Будь-яка пропозиція?
Марчелло Перрі

10

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

У той же час це дало мені достатньо вказівки для вирішення моїх потреб у наступному коді - який я розміщую тут для будь-яких інших людей, які мають таку ж потребу, як моя, і які можуть натрапити на цю сторінку в пошуку рішення.

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

Завдяки тим, чиї рішення допомогли мені дійти до того, що мені потрібно.


7

Ну, я думаю, тут чогось не вистачає. Користувач хоче отримати дані за останній рік, а не за останні 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


4

Найчитабельніший, IMO:

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) = '27.08.2007'
  3. Перетворюється на CONVERT дати (дата, '8/27/2007') = # 8/27/2008 12:00
  4. Віднімає 1 рік DATEADD (yy, -1, # 8/27/2008 00:00#) = # 8/27/2007 00:00#

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


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

0

Інші пропозиції хороші, якщо у вас є лише "SQL".

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

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


2
Було б краще, якщо ви створите параметризований рядок і уникаєте розміщення значення в самій рядку ...
Adriaan Davel

0

аргумент функції DATEADD:

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

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

число - це вираз, який можна вирішити до int, який додається до частини дати

date - це вираз, який можна визначити часом, датою, малим часом часу, датою, датою2 або значенням зміщення дати.


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

1
Це не стосується питання.
Натан Скерл

Також
цикл

0

Я, як @DE White, приїхав сюди з подібних, але інших причин, ніж первісне питання. Оригінальне запитання задається за останні 365 днів. @ Samjudson відповідь передбачає це. Відповідь @DE White повертає результати за попередній календарний рік.

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

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

Наприклад, 17 лютого 2017 року цей запит повертає результати з 1.01.2016 по 17.02.2017


0

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

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

0

Чомусь жоден з вищезазначених результатів не працював для мене.

Це вибирає останні 365 днів.

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

було б добре, якби ви могли додати версію MSSQL-сервера, для якої це працює.
itwasntme
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.