문제

작년에만 데이터를 가져와야하는 쿼리를 작성하고 있습니다. 이것을하는 가장 좋은 방법은 무엇입니까?

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)))

어느:

  1. Now의 DateTime을 얻습니다 getDate () = #8/27/2008 10:23 am#
  2. 형식 101이있는 문자열로 변환됩니다 변환 (Varchar, #8/27/2008 10:23 AM#, 101) = '8/27/2007'
  3. DateTime으로 변환됩니다 변환 (DateTime, '8/27/2007') = #8/27/2008 12:00 am#
  4. 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())
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top