SQL Server : 지난 1 년 동안 만 데이터 가져 오기


98

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

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

답변:


196

다음은 현재 날짜에 -1 년을 추가합니다.

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

1
당신의 것이 더 깨끗하지만 여기에 내가 가진 것이 있습니다 : YEAR (GETDATE ())-1
PCPGMR

2
날짜가 아닌 숫자를 반환하므로 해당 날짜의 연도를 계산하지 않고는 날짜와 비교할 수 없습니다. 그러면 2014 년 12 월 31 일 대 2015 년 1 월 1 일에 대해 잘못된 결과가 반환됩니다. 이는 다른 연도이지만 1 년 간격은 아닙니다 ...
samjudson

옳은. 연도별로 연도를 비교해야했기 때문에 2013 년부터 2014 년까지 들어오는 데이터에는 연도 만있었습니다. 내 의견에 명확하지 않았습니다. 감사합니다
PCPGMR 2015 년

이 쿼리를 실행하는 동안 오류 메시지가 나타납니다. "FUNCTION DatabaseName.DATEADD가 존재하지 않습니다."제안 사항이 있습니까?
Marcello Perri

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) = '8/27/2007' 형식의 문자열로 변환합니다.
  3. 날짜 시간으로 변환 CONVERT (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를 사용하여 오늘 자정을 얻을 수있는 변형이 있지만 다소 둔화되는 경향이 있습니다 (성능이 약간 더 좋지만 데이터를 가져 오는 데 필요한 읽기에 비해 눈치 채지 못함).


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 일 수 있습니다.

숫자 는 날짜의 날짜 부분에 추가되는 정수로 해석 될 수있는 표현식입니다.

date 는 시간, 날짜, smalldatetime, datetime, datetime2 또는 datetimeoffset 값으로 확인할 수있는 식입니다.


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
이것은 질문을 해결하지 않습니다.
Nathan Skerl

또한, 동안 루프는 SQL 위해 일반적으로 나쁜
StingyJack

0

나는 @DE White처럼 원래 질문과 비슷하지만 다른 이유로 여기에 왔습니다. 원래 질문은 지난 365 일 동안 묻습니다. @samjudson의 대답은 그것을 제공합니다. @DE White의 답변은 전년도에 대한 결과를 반환합니다.

내 쿼리는 현재 날짜를 포함하여 전년도에 대해 작동한다는 점에서 약간 다릅니다 .

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

예를 들어 2017 년 2 월 17 일에이 쿼리는 2016 년 1 월 1 일부터 2017 년 2 월 17 일까지의 결과를 반환합니다.


0

비슷한 문제가 있었지만 이전 코더는 날짜를 mm-yyyy 형식으로 만 제공했습니다. 내 솔루션은 간단하지만 일부 사용자에게는 도움이 될 수 있습니다 (시작 및 끝 공백이 제거되었는지 확인하고 싶었습니다).

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.