[SQL] SQL 서버에서 지난 달의 레코드를 가져 오기
SQLSQL 서버에서 지난 달의 레코드를 가져 오기
내 DB 테이블 "DATE_CREATED"[회원] 필드를 기준으로 지난 달의 기록을 싶어.
이 작업을 수행 할 수있는 SQL은 무엇입니까?
설명을 위해, 지난 달 - 2009년 1월 8일 31/8/2009을에
오늘 2010년 3월 1일 인 경우에, 나는 31/12/2009에 2009년 1월 12일의 기록을 얻을해야합니다.
해결법
-
==============================
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.모든 기존 (작업) 답이 두 가지 문제 중 하나
모든 기존 (작업) 답이 두 가지 문제 중 하나
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.모든 귀하의 인덱스를 사용하지 않습니다 지금까지 제공 한 옵션을 추가합니다.
모든 귀하의 인덱스를 사용하지 않습니다 지금까지 제공 한 옵션을 추가합니다.
이런 식으로 뭔가 트릭을 수행하고 (있는 경우) 테이블에 인덱스를 사용하게됩니다.
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.
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.지난 달은 달의 마지막 날까지로 고려한다. 달의 31/01/2016 여기 마지막 날은 지난 30 일 유사하지 31 년 1 월이 될 것입니다.
지난 달은 달의 마지막 날까지로 고려한다. 달의 31/01/2016 여기 마지막 날은 지난 30 일 유사하지 31 년 1 월이 될 것입니다.
SELECT CONVERT(DATE, DATEADD(DAY,-DAY(GETDATE()),GETDATE()))
-
==============================
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.
declare @PrevMonth as nvarchar(256) SELECT @PrevMonth = DateName( month,DATEADD(mm, DATEDIFF(mm, 0, getdate()) - 1, 0)) + '-' + substring(DateName( Year, getDate() ) ,3,4)
-
==============================
8.SQL 쿼리는 현재 월의 기록을 얻을 수 있습니다 만
SQL 쿼리는 현재 월의 기록을 얻을 수 있습니다 만
SELECT * FROM CUSTOMER WHERE MONTH(DATE) = MONTH(CURRENT_TIMESTAMP) AND YEAR(DATE) = YEAR(CURRENT_TIMESTAMP);
-
==============================
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.
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.
WHERE date_created >= DATEADD(MONTH, DATEDIFF(MONTH, 31, CURRENT_TIMESTAMP), 0) AND date_created < DATEADD(MONTH, DATEDIFF(MONTH, 0, CURRENT_TIMESTAMP), 0)
-
==============================
12.나는 오라클 ENV에서 그리고 난 오라클에서이 같은 그것을 할 것입니다 :
나는 오라클 ENV에서 그리고 난 오라클에서이 같은 그것을 할 것입니다 :
select * from table where trunc(somedatefield, 'MONTH') = trunc(sysdate -INTERVAL '0-1' YEAR TO MONTH, 'MONTH')
아이디어 : 내가 이전 달의 예약 된 보고서를 실행 해요 (하루 1 월의 마지막 날에, 윈도 윙되지 않음). 이 인덱스 비우호적이 될 수 있지만, 오라클은 어쨌든 빨리 일 처리가 있습니다. MS SQL에서 유사한 간단하고 짧은 방법이 있습니까? 대답 비교 연도와 월은 별도로 오라클 사람들을 바보 같다.
-
==============================
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.지난 1 개월 SQL Server의 :
지난 1 개월 SQL Server의 :
select * from tablename where order_date > DateAdd(WEEK, -1, GETDATE()+1) and order_date<=GETDATE()
-
==============================
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.
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.나는 비슷한 문제를 해결하는 방법은 내 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.지난 달 찾고 있다면, 그래서 이것을 시도
지난 달 찾고 있다면, 그래서 이것을 시도
SELECT FROM #emp WHERE DATEDIFF(MONTH,CREATEDDATE,GETDATE()) = 1
지난 달 찾고 있다면, 그래서 이것을 시도
SELECT FROM #emp WHERE DATEDIFF(day,CREATEDDATE,GETDATE()) between 1 and 30
-
==============================
19.나를 위해 작동 간단한 쿼리는 다음과 같습니다
나를 위해 작동 간단한 쿼리는 다음과 같습니다
테이블 선택 * 여기서 DATEADD (월, 1하여 DateField)> = GETDATE ()
-
==============================
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을 작동합니다.
from https://stackoverflow.com/questions/1424999/get-the-records-of-last-month-in-sql-server by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL은 두 개의 테이블에서 데이터를 비교 (0) | 2020.04.13 |
---|---|
[SQL] 교리 2 사용하여 원시 SQL을 실행 (0) | 2020.04.13 |
[SQL] 테이블의 열 수를 찾기 (0) | 2020.04.13 |
[SQL] Select 문에서 케이스 (0) | 2020.04.13 |
[SQL] 쿼리 SQLite는 반경에 따라 기록을 얻으려면? (0) | 2020.04.13 |