SQL Server : 지난해에만 데이터를 얻습니다.
-
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'
Bol에서 Dateadd를 찾으십시오
dateadd(yy,-1,getdate())
가장 읽기 쉬운 IMO :
SELECT * FROM TABLE WHERE Date >
DATEADD(yy, -1, CONVERT(datetime, CONVERT(varchar, GETDATE(), 101)))
어느:
- Now의 DateTime을 얻습니다 getDate () = #8/27/2008 10:23 am#
- 형식 101이있는 문자열로 변환됩니다 변환 (Varchar, #8/27/2008 10:23 AM#, 101) = '8/27/2007'
- DateTime으로 변환됩니다 변환 (DateTime, '8/27/2007') = #8/27/2008 12:00 am#
- 1 년을 빼냅니다 Dateadd (YY, -1, #8/27/2008 12:00 am#) = #8/27/2007 12:00 am#
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 쿼리에 문자열로 삽입하십시오.
최소한 큰 테이블 (즉, 수백만 행, 조인과 결합)의 경우 최적화기가 훨씬 더 잘 작동 할 수 있기 때문에 상당한 속도 개선을 제공합니다.
DateDd 기능에 대한 인수 :
DATEADD (*datepart* , *number* , *date* )
날짜 부분 할 수 : YY, QQ, MM, DY, DD, WK, DW, HH, MI, SS, MS
숫자 날짜 부분에 추가되는 int로 해결 될 수있는 표현식입니다.
데이트 시간, 날짜, smalldateMe, 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
나는 @de White와 마찬가지로 원래 질문과 비슷하지만 다른 이유로 여기에 왔습니다. 원래 질문은 지난 365 일을 요구합니다. @samjudson의 답변은 그것을 제공합니다. @DE White의 답변은 이전 연도의 결과를 반환합니다.
내 쿼리는 그것이 작동한다는 점에서 약간 다릅니다. 현재 날짜까지까지 전년도 :
SELECT .... FROM .... WHERE year(date) > year(DATEADD(year, -2, GETDATE()))
예를 들어, 2017 년 2 월 17 일 에이 쿼리는 2016 년 1 월 1 일부터 2017 년 2 월 2 일까지 결과를 반환합니다.
비슷한 문제가 있었지만 이전 코더는 날짜를 mm-yyyy 형식으로 만 제공했습니다. 내 솔루션은 간단하지만 일부는 도움이 될 수 있습니다 (또한 시작과 끝 공간이 제거되었는지 확인하고 싶었습니다).
SELECT ... FROM ....WHERE
CONVERT(datetime,REPLACE(LEFT(LTRIM([MoYr]),2),'-
','')+'/01/'+RIGHT(RTRIM([MoYr]),4)) >= DATEADD(year,-1,GETDATE())