복붙노트

[SQL] SQL 서버에서 지난 달의 레코드를 가져 오기

SQL

SQL 서버에서 지난 달의 레코드를 가져 오기

내 DB 테이블 "DATE_CREATED"[회원] 필드를 기준으로 지난 달의 기록을 싶어.

이 작업을 수행 할 수있는 SQL은 무엇입니까?

설명을 위해, 지난 달 - 2009년 1월 8일 31/8/2009을에

오늘 2010년 3월 1일 인 경우에, 나는 31/12/2009에 2009년 1월 12일의 기록을 얻을해야합니다.

해결법

  1. ==============================

    1.

    SELECT * 
    FROM Member
    WHERE DATEPART(m, date_created) = DATEPART(m, DATEADD(m, -1, getdate()))
    AND DATEPART(yyyy, date_created) = DATEPART(yyyy, DATEADD(m, -1, getdate()))
    

    당신은 월 및 연도를 확인해야합니다.

  2. ==============================

    2.모든 기존 (작업) 답이 두 가지 문제 중 하나

    모든 기존 (작업) 답이 두 가지 문제 중 하나

    1. 무시 지수 :

    대부분의 경우, 열 존재가 검색 할 때 호출하는 기능, 최적화 알고리즘은 컬럼에 인덱스를 무시하고 모든 레코드를 검색한다 (CAST에 대한처럼, 암시 적으로 포함)가 있습니다. 다음은 간단한 예제이다 :

    우리는 타임 스탬프 함께있을 거래, 대부분의 RDBMS는 어떤 종류의 증가 값, 밀리 / 나노초의 보통 긴 또는 BigInteger의 계산으로이 정보를 저장하는 경향이있다. 따라서 보이는 현재 시간 / 다음과 같이 저장됩니다

    1402401635000000  -- 2014-06-10 12:00:35.000000 GMT
    

    당신은 거기에 '년'값 ( '2014')을 볼 수 없습니다, 당신은 무엇입니까? 사실, 복잡한 수학의 공정한 비트가 앞뒤로 번역 할 수있다. 당신이 열을 검색 한에 추출 / 날짜 부분의 함수를 호출한다면, 서버는 결과에 포함 할 수있는 경우 수학 그냥 알아 내기 위해 모든 것을 수행 할 수있다. 작은 테이블에서 이것은 문제가되지 않지만 선택된 행의 비율이 감소함에 따라 이는 대형화 드레인된다. 그리고이 경우에, 당신은 MONTH 대해 문의 그것을 두 번하고있는 ... 음, 당신은 그림을 얻는다.

    2. 의도하지 않은 데이터 :

    BETWEEN 사용하여 특정 SQL 서버의 버전 및 컬럼 데이터 유형에 따라 (또는 이와 유사한 포함 상한선 범위 <=) 선택되는 잘못된 데이터가 발생할 수있다. 기본적으로, 당신은 잠재적으로 "다음"일 자정에서 데이터를 포함하거나, "현재"일의 기록의 일부를 제외하고 끝낸다.

    당신은 일을해야 무엇 :

    우리는 우리의 데이터를 안전하고 인덱스를 (가능한 경우)를 사용하는 방법이 필요합니다 그래서. 올바른 방법은 다음의 형식입니다 :

    WHERE date_created >= @startOfPreviousMonth AND date_created < @startOfCurrentMonth
    

    단지 일개월가 있음을 감안할 때, @startOfPreviousMonth 쉽게 / 대체 할 수 있습니다에 의해 유도 :

    DATEADD(month, -1, @startOCurrentfMonth)
    

    서버에서 시작-의 전류 개월을 도출해야하는 경우에는 다음을 통해 그것을 할 수 있습니다 :

    DATEADD(month, DATEDIFF(month, 0, CURRENT_TIMESTAMP), 0)
    

    여기에 설명을 몇 마디. 본질적으로 큰 정수를 반환 - (어떤 AD, CE, 0001-01-01) 초기 DATEDIFF (...) 현재의 시대의 시작 사이의 차이를 얻을 것이다. 이것은 현재 월의 시작 개월의 수입니다. 우리는, 지정된 달의 시작입니다 시대의 시작에이 번호를 추가합니다.

    전체 스크립트는 / 다음과 유사합니다 수 있도록 :

    DECLARE @startOfCurrentMonth DATETIME
    SET @startOfCurrentMonth = DATEADD(month, DATEDIFF(month, 0, CURRENT_TIMESTAMP), 0)
    
    SELECT *
    FROM Member
    WHERE date_created >= DATEADD(month, -1, @startOfCurrentMonth) -- this was originally    misspelled
          AND date_created < @startOfCurrentMonth
    

    모든 날짜의 작업은 따라서 하나 개의 값에, 한 번 수행됩니다; 최적화는 사용 지수에 대한 무료이며, 어떤 부정확 한 데이터가 포함되지 않습니다.

  3. ==============================

    3.모든 귀하의 인덱스를 사용하지 않습니다 지금까지 제공 한 옵션을 추가합니다.

    모든 귀하의 인덱스를 사용하지 않습니다 지금까지 제공 한 옵션을 추가합니다.

    이런 식으로 뭔가 트릭을 수행하고 (있는 경우) 테이블에 인덱스를 사용하게됩니다.

    DECLARE @StartDate DATETIME, @EndDate DATETIME
    SET @StartDate = dateadd(mm, -1, getdate())
    SET @StartDate = dateadd(dd, datepart(dd, getdate())*-1, @StartDate)
    SET @EndDate = dateadd(mm, 1, @StartDate)
    
    SELECT *
    FROM Member
    WHERE date_created BETWEEN @StartDate AND @EndDate
    
  4. ==============================

    4.

    DECLARE @StartDate DATETIME, @EndDate DATETIME
    SET @StartDate = DATEADD(mm, DATEDIFF(mm,0,getdate())-1, 0)
    SET @EndDate = DATEADD(mm, 1, @StartDate)
    
    SELECT *
    FROM Member
    WHERE date_created BETWEEN @StartDate AND @EndDate
    

    mrdenny의 솔루션에 대한 업그레이드는,이 방법은 당신이에서 정확하게 지난달 얻을 YYYY-MM-01

  5. ==============================

    5.지난 달은 달의 마지막 날까지로 고려한다. 달의 31/01/2016 여기 마지막 날은 지난 30 일 유사하지 31 년 1 월이 될 것입니다.

    지난 달은 달의 마지막 날까지로 고려한다. 달의 31/01/2016 여기 마지막 날은 지난 30 일 유사하지 31 년 1 월이 될 것입니다.

    SELECT CONVERT(DATE, DATEADD(DAY,-DAY(GETDATE()),GETDATE()))
    
  6. ==============================

    6.한 가지 방법은 그것이 DATEPART 기능을 사용 할 수 있습니다 :

    한 가지 방법은 그것이 DATEPART 기능을 사용 할 수 있습니다 :

    select field1, field2, fieldN from TABLE where DATEPART(month, date_created) = 4 
    and DATEPART(year, date_created) = 2009
    

    월 모든 날짜를 반환합니다. 지난 달의 경우 (즉, 현재 월 이전) 당신은뿐만 아니라 GETDATE 및 DATEADD를 사용할 수 있습니다 :

    select field1, field2, fieldN from TABLE where DATEPART(month, date_created) 
    = (DATEPART(month, GETDATE()) - 1) and 
    DATEPART(year, date_created) = DATEPART(year, DATEADD(m, -1, GETDATE()))
    
  7. ==============================

    7.

    declare @PrevMonth as nvarchar(256)
    
    SELECT @PrevMonth = DateName( month,DATEADD(mm, DATEDIFF(mm, 0, getdate()) - 1, 0)) + 
       '-' + substring(DateName( Year, getDate() ) ,3,4)
    
  8. ==============================

    8.SQL 쿼리는 현재 월의 기록을 얻을 수 있습니다 만

    SQL 쿼리는 현재 월의 기록을 얻을 수 있습니다 만

    SELECT * FROM CUSTOMER
    WHERE MONTH(DATE) = MONTH(CURRENT_TIMESTAMP) AND YEAR(DATE) = YEAR(CURRENT_TIMESTAMP);
    
  9. ==============================

    9.

    select * from [member] where DatePart("m", date_created) = DatePart("m", DateAdd("m", -1, getdate())) AND DatePart("yyyy", date_created) = DatePart("yyyy", DateAdd("m", -1, getdate()))
    
  10. ==============================

    10.

    DECLARE @StartDate DATETIME, @EndDate DATETIME    
    SET @StartDate = DATEADD(mm, DATEDIFF(mm, 0, getdate()) - 1, 0)    
    SET @EndDate = dateadd(dd, -1, DATEADD(mm, 1, @StartDate))
    
    SELECT * FROM Member WHERE date_created BETWEEN @StartDate AND @EndDate 
    

    및 mrdenny의 솔루션에 또 다른 업그레이드. 그것은뿐만 아니라 이전 달의 정확한 마지막 날을 제공합니다.

  11. ==============================

    11.

    WHERE 
        date_created >= DATEADD(MONTH, DATEDIFF(MONTH, 31, CURRENT_TIMESTAMP), 0)
        AND date_created < DATEADD(MONTH, DATEDIFF(MONTH, 0, CURRENT_TIMESTAMP), 0)
    
  12. ==============================

    12.나는 오라클 ENV에서 그리고 난 오라클에서이 같은 그것을 할 것입니다 :

    나는 오라클 ENV에서 그리고 난 오라클에서이 같은 그것을 할 것입니다 :

    select * from table
    where trunc(somedatefield, 'MONTH') =
    trunc(sysdate -INTERVAL '0-1' YEAR TO MONTH, 'MONTH')
    

    아이디어 : 내가 이전 달의 예약 된 보고서를 실행 해요 (하루 1 월의 마지막 날에, 윈도 윙되지 않음). 이 인덱스 비우호적이 될 수 있지만, 오라클은 어쨌든 빨리 일 처리가 있습니다. MS SQL에서 유사한 간단하고 짧은 방법이 있습니까? 대답 비교 연도와 월은 별도로 오라클 사람들을 바보 같다.

  13. ==============================

    13.이 쿼리 지난 달 기록을 얻을 수 있습니다

    이 쿼리 지난 달 기록을 얻을 수 있습니다

    SELECT * FROM dbo.member d 
    WHERE  CONVERT(DATE, date_created,101)>=CONVERT(DATE,DATEADD(m, datediff(m, 0, current_timestamp)-1, 0)) 
    and CONVERT(DATE, date_created,101) < CONVERT(DATE, DATEADD(m, datediff(m, 0, current_timestamp)-1, 0),101) 
    
  14. ==============================

    14.지난 1 개월 SQL Server의 :

    지난 1 개월 SQL Server의 :

    select * from tablename 
    where order_date > DateAdd(WEEK, -1, GETDATE()+1) and order_date<=GETDATE()
    
  15. ==============================

    15.

    DECLARE @curDate INT = datepart( Month,GETDATE())
    IF (@curDate = 1)
        BEGIN
            select * from Featured_Deal
            where datepart( Month,Created_Date)=12 AND datepart(Year,Created_Date) = (datepart(Year,GETDATE())-1)
    
        END
    ELSE
        BEGIN
            select * from Featured_Deal
            where datepart( Month,Created_Date)=(datepart( Month,GETDATE())-1) AND datepart(Year,Created_Date) = datepart(Year,GETDATE())
    
        END 
    
  16. ==============================

    16.

    DECLARE @StartDate DATETIME, @EndDate DATETIME
    SET @StartDate = dateadd(mm, -1, getdate())
    SET @StartDate = dateadd(dd, datepart(dd, getdate())*-1, @StartDate)
    SET @EndDate = dateadd(mm, 1, @StartDate)
    set @StartDate = DATEADD(dd, 1 , @StartDate)
    
  17. ==============================

    17.나는 비슷한 문제를 해결하는 방법은 내 SELECT 부분에 월을 추가했다

    나는 비슷한 문제를 해결하는 방법은 내 SELECT 부분에 월을 추가했다

    Month DATEADD(day,Created_Date,'1971/12/31') As Month
    

    나는 WHERE 문에 추가보다

    Month DATEADD(day,Created_Date,'1971/12/31') = month(getdate())-1
    
  18. ==============================

    18.지난 달 찾고 있다면, 그래서 이것을 시도

    지난 달 찾고 있다면, 그래서 이것을 시도

    SELECT
    FROM  #emp 
    WHERE DATEDIFF(MONTH,CREATEDDATE,GETDATE()) = 1
    

    지난 달 찾고 있다면, 그래서 이것을 시도

    SELECT
    FROM #emp
    WHERE DATEDIFF(day,CREATEDDATE,GETDATE()) between 1 and 30
    
  19. ==============================

    19.나를 위해 작동 간단한 쿼리는 다음과 같습니다

    나를 위해 작동 간단한 쿼리는 다음과 같습니다

    테이블 선택 * 여기서 DATEADD (월, 1하여 DateField)> = GETDATE ()

  20. ==============================

    20.당신은 이전 달의 데이터를 찾는 경우 :

    당신은 이전 달의 데이터를 찾는 경우 :

    date(date_created)>=date_sub(date_format(curdate(),"%Y-%m-01"),interval 1 month) and 
    date(date_created)<=date_sub(date_format(curdate(),'%Y-%m-01'),interval 1 day)
    

    또한이 때 해 변화를 작동합니다. 또한 MySQL을 작동합니다.

  21. from https://stackoverflow.com/questions/1424999/get-the-records-of-last-month-in-sql-server by cc-by-sa and MIT license