복붙노트

[SQL] GETDATE 지난 달

SQL

GETDATE 지난 달

나는 웹 사이트의 통계를 마지막으로 목록에 노력하고 있습니다. 나는 30 일에 마지막을 나열;

CONVERT(VARCHAR(10), S.DATEENTERED, 101) 
  BETWEEN 
    CONVERT(VARCHAR(10), GETDATE()-30, 101) 
  AND 
    CONVERT(VARCHAR(10), GETDATE(), 101) 

이 달;

RIGHT(CONVERT(VARCHAR(10), S.DATEENTERED, 103), 7) = 
RIGHT(CONVERT(VARCHAR(10), GETDATE(), 103), 7)

하지만 지난 달에 사용하는 것을 쿼리 아무 생각이 없습니다. 나는 시도했다;

RIGHT(CONVERT(VARCHAR(10), S.DATEENTERED, 103), 7) = 
RIGHT(CONVERT(VARCHAR(10), GETDATE()-1, 103), 7) 

작동하지 않았다.

해결법

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

    1.다음은 당신에게 지난 달의 시작을 찾을 수 있습니다 :

    다음은 당신에게 지난 달의 시작을 찾을 수 있습니다 :

    -- Start of last month 
    SELECT CAST('01 '+ RIGHT(CONVERT(CHAR(11),DATEADD(MONTH,-1,GETDATE()),113),8) AS datetime)
    

    그런 다음, 마이너스 하나를 사용하여,이 달의 시작을 찾을 것입니다.

    -- Start of the month 
    SELECT CAST('01 '+ RIGHT(CONVERT(CHAR(11),GETDATE(),113),8) AS datetime) 
    

    내가 SQL 서버 I의 날짜와 작업해야 종종 로빈 페이지의 SQL 서버 날짜 / 시간 워크 벤치를 참조합니다. 워크 벤치 (튜토리얼) 잘 배치 및 단지 SQL 서버에서 날짜와 작업 할 때 내가 필요로 한 모든 것을 포함합니다.

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

    2.날짜는 항상 프로그래밍 언어로, SQL은 제외되지 작업 할 기쁨입니다.

    날짜는 항상 프로그래밍 언어로, SQL은 제외되지 작업 할 기쁨입니다.

    지난 달 발생한 모든 기록을 찾기 위해 귀하의 질문에 대답하려면

    select S.DATEENTERED
          ,*
      from sometable S
     where S.DATEENTERED
           between dateadd(mm, datediff(mm, 0, dateadd(MM, -1, getdate())), 0)
               and dateadd(ms, -3, dateadd(mm, datediff(mm, 0, dateadd(MM, -1, getdate())) + 1, 0))
    order by 1
    

    특정 시간 프레임 내에서 기록을 얻기를 위해 최선의 방법을 확장하려면 WHERE 절에 DATEDIFF 함수 DATEADD 함수와 상태 사이를 활용하는 것입니다.

    select 'howdy'
          ,getdate()
     where getdate()
           between dateadd(mm, 0, 0)
               and dateadd(ms, -3, dateadd(mm, datediff(mm, 0, dateadd(mm,-1,getutcdate())) + 1, 0))
    

    위의 코드는 레코드가 오늘의 날짜가 있는지 확인하기 때문에 반환에 발생합니다 00 1900-01-01 간 : 00 : 00.000 지난 달의 마지막 가능한 기록 된 날짜 (마지막 날 23 : 59 : 59.997 - SQL 서버 DATETIME 컬럼)는 대부분 3 밀리 초 해상도 있습니다.

    우리가 찾고있는 날짜를 한 달 전에 같이 다음 코드는 기록을 반환합니다.

    select 'howdy'
          ,dateadd(mm, -1, getdate())
     where dateadd(mm, -1, getdate())
           between dateadd(mm, 0, 0)
               and dateadd(ms, -3, dateadd(mm, datediff(mm, 0, dateadd(mm,-1,getutcdate())) + 1, 0))
    

    where 절의 브레이크 다운 :

    WHERE getdate()  -- date to check
    between dateadd(mm, 0, 0) -- begin date
    and dateadd(ms, -3, dateadd(mm, datediff(mm, 0, dateadd(mm,-1,getutcdate())) + 1, 0)) -- end date
    

    마지막으로, 날짜의 다양한이 방법으로 확인 할 수 있습니다 여기에 꽤 전체 목록입니다 :

    select dateadd(mm, 0, 0) as BeginningOfTime
          ,dateadd(dd, datediff(dd, 0, getdate()), 0) as Today
          ,dateadd(wk, datediff(wk, 0, getdate()), 0) as ThisWeekStart
          ,dateadd(mm, datediff(mm, 0, getdate()), 0) as ThisMonthStart
          ,dateadd(qq, datediff(qq, 0, getdate()), 0) as ThisQuarterStart
          ,dateadd(yy, datediff(yy, 0, getdate()), 0) as ThisYearStart
          ,dateadd(dd, datediff(dd, 0, getdate()) + 1, 0) as Tomorrow
          ,dateadd(wk, datediff(wk, 0, getdate()) + 1, 0) as NextWeekStart
          ,dateadd(mm, datediff(mm, 0, getdate()) + 1, 0) as NextMonthStart
          ,dateadd(qq, datediff(qq, 0, getdate()) + 1, 0) as NextQuarterStart
          ,dateadd(yy, datediff(yy, 0, getdate()) + 1, 0) as NextYearStart
          ,dateadd(ms, -3, dateadd(dd, datediff(dd, 0, getdate()) + 1, 0)) as TodayEnd
          ,dateadd(ms, -3, dateadd(wk, datediff(wk, 0, getdate()) + 1, 0)) as ThisWeekEnd
          ,dateadd(ms, -3, dateadd(mm, datediff(mm, 0, getdate()) + 1, 0)) as ThisMonthEnd
          ,dateadd(ms, -3, dateadd(qq, datediff(qq, 0, getdate()) + 1, 0)) as ThisQuarterEnd
          ,dateadd(ms, -3, dateadd(yy, datediff(yy, 0, getdate()) + 1, 0)) as ThisYearEnd
    

    임의의 유형의 범위가 결정될 수있다 목록에 기재된 사용.

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

    3.이건 어때요?

    이건 어때요?

    select DATEADD(month, -1, GETDATE())
    
  4. ==============================

    4.내가 지난 달 1 일 및 작업에 대한 현재 월의 첫 날을 사용하는 것이 좋습니다 오히려 사용 사이 사용하는 것보다 것이다> = 및 <. 그건 내 개인적인 의견이지만, 나는 당신이이 방법 성능 및 유지 관리 이점이있다 찾을 생각합니다.

    내가 지난 달 1 일 및 작업에 대한 현재 월의 첫 날을 사용하는 것이 좋습니다 오히려 사용 사이 사용하는 것보다 것이다> = 및 <. 그건 내 개인적인 의견이지만, 나는 당신이이 방법 성능 및 유지 관리 이점이있다 찾을 생각합니다.

    여기에 SQL입니다. 당신은 당신이 다른 접근 방식으로가는 결국 단지의 경우 지난 달 값의 마지막 날을 포함 시켰습니다 알 수 있습니다.

    명심하십시오,이 날짜는 일이 오전 12 기반으로하고 있습니다. 즉, 2009년 6월 1일 및 2009년 6월 30일 사이에 점점 값은 2009년 6월 30일 모두 제외 당신이 원하는 당신을받지 않습니다. 당신 7 월 (2009년 7월 1일)의 첫 날을 사용하는 경우는 적용됩니다.

    아래 그림과 같이 다시 말하지만, 나는 모두 함께 BETWEEN 피하는 것이 좋습니다. 행운을 빕니다.

    Declare @LastMonthFirstDay datetime
    Declare @LastMonthLastDay datetime
    Declare @ThisMonthFirstDay datetime
    
    Set @LastMonthFirstDay =  DATEADD(MONTH, DATEDIFF(MONTH, 0, CURRENT_TIMESTAMP) - 1, 0);
    Set @ThisMonthFirstDay = DATEADD(MONTH, DATEDIFF(MONTH, 0, CURRENT_TIMESTAMP), 0);
    Set @LastMonthLastDay = DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH, 0, CURRENT_TIMESTAMP), 0));
    
    Select * From Table
    Where DateEntered >= @LastMonthFirstDay 
    And DateEntered < @ThisMonthFirstDay;
    
  5. ==============================

    5.DATEADD 기능을 사용해보십시오. 당신은 MONTH (mm) 날짜 부분에 -1을 추가 할 수 있으며 작동합니다. 여기 링크입니다

    DATEADD 기능을 사용해보십시오. 당신은 MONTH (mm) 날짜 부분에 -1을 추가 할 수 있으며 작동합니다. 여기 링크입니다

  6. ==============================

    6.

    where year(S.DATEENTERED) = year(dateadd(mm, -1, getdate())) and month(S.DATEENTERED) = month(dateadd(mm, -1, getdate()))
    

    좋은 성능 현명한되지 않을 수 있습니다하지만 당신은 생각을 가지고있다.

  7. ==============================

    7.FIRST DAY 지난달를 GET

    FIRST DAY 지난달를 GET

    SELECT DATEADD(MM, DATEDIFF(MM, '01/01/2000', DATEADD(MM, -1,GETDATE())), '01/01/2000')
    

    마지막 날 지난 달을 GET

    SELECT DATEADD(SS,-1,DATEADD(MM, DATEDIFF(MM,'01/01/2000',GETDATE()),'01/01/2000')) 
    

    그런 다음이 범위를 기반으로 검색 할 수 있습니다.

  8. ==============================

    8.시험:

    시험:

    declare @lastm int
    set @lastm = datepart(mm,getdate()) - 1
    

    ...

    where datepart(mm,s.dateentered) = @lastm
    
  9. from https://stackoverflow.com/questions/1114592/getdate-last-month by cc-by-sa and MIT license