Відповіді:
Далі додано -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'
Найчитабельніший, IMO:
SELECT * FROM TABLE WHERE Date >
DATEADD(yy, -1, CONVERT(datetime, CONVERT(varchar, GETDATE(), 101)))
Котрий:
Є варіанти з 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* )
datepart може бути: yy, qq, mm, dy, dd, wk, dw, hh, mi, ss, ms
число - це вираз, який можна вирішити до int, який додається до частини дати
date - це вираз, який можна визначити часом, датою, малим часом часу, датою, датою2 або значенням зміщення дати.
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
Я, як @DE White, приїхав сюди з подібних, але інших причин, ніж первісне питання. Оригінальне запитання задається за останні 365 днів. @ Samjudson відповідь передбачає це. Відповідь @DE White повертає результати за попередній календарний рік.
Мій запит дещо відрізняється тим, що він працює за попередній рік, включаючи поточну дату:
SELECT .... FROM .... WHERE year(date) > year(DATEADD(year, -2, GETDATE()))
Наприклад, 17 лютого 2017 року цей запит повертає результати з 1.01.2016 по 17.02.2017
У мене була подібна проблема, але попередній кодер вказав дату лише у форматі мм-гггг Моє рішення просте, але може виявитися корисним для деяких (я також хотів би бути впевненим, що пробіли початку та кінця були усунені):
SELECT ... FROM ....WHERE
CONVERT(datetime,REPLACE(LEFT(LTRIM([MoYr]),2),'-
','')+'/01/'+RIGHT(RTRIM([MoYr]),4)) >= DATEADD(year,-1,GETDATE())