SQL Server에서 지난달의 레코드를 가져옵니다.
db table [member]필드 "date_created"를 기준으로 지난달 기록을 취득하고 싶습니다.
이를 위한 SQL은 무엇입니까?
자세한 내용은 지난달 - 2009년 1월 8일 ~2009년 31일
오늘이 2010년 3월 1일이라면 2009년 1월 12일부터 2009년 31일까지의 기록을 입수할 필요가 있습니다.
기존의 (실행중의) 모든 응답에는, 다음의 2개의 문제 중 하나가 있습니다.
- 검색 중인 열의 인덱스를 무시합니다.
- 는 의도하지 않은 데이터를 (잠재적으로) 선택하여 결과를 자동으로 손상시킵니다.
1. 무시된 지수:
검색 예를 들어, 「」와 )CAST
하고 모든 를 검색해야 합니다하다
는 이 정보를 a루루루루루루루루루 of of of)로 저장하는 .대부분의 RDBMS는 이 정보를 어떤 종류의 증가치(일반적으로long
★★★★★★★★★★★★★★★★★」BIGINTEGER
은 다음과같이 됩니다.따라서 현재 시간은 다음과 같이 저장됩니다.
1402401635000000 -- 2014-06-10 12:00:35.000000 GMT
Year('Year').'2014'
그안 、 신은 、 ??사실, 앞뒤로 해석하기에는 꽤 복잡한 수학이 있습니다.따라서 검색된 열에서 추출/날짜 부품 함수를 호출하면 서버는 결과에 해당 함수를 포함시킬 수 있는지 확인하기 위해 모든 계산을 수행해야 합니다.작은 테이블에서는 이것은 문제가 되지 않지만 선택한 행의 비율이 감소하면 점점 더 큰 배수량이 됩니다. 두 MONTH
요,알겠습니다,알겠습니다,알겠습니다.
2. 의도하지 않은 데이터:
Server의 및 에 따라 SQL Server를 사용하는 BETWEEN
한 포함 (「」의 상한 범위:<=
)는 잘못된 데이터가 선택될 수 있습니다.기본적으로 "다음"일 자정부터 데이터를 포함하거나 "현재"일 레코드의 일부를 제외하게 될 수 있습니다.
해야 할 일:
따라서 데이터를 안전하게 보호하고 인덱스(가능한 경우)를 사용할 수 있는 방법이 필요합니다.올바른 방법은 다음과 같습니다.
WHERE date_created >= @startOfPreviousMonth AND date_created < @startOfCurrentMonth
안 @startOfPreviousMonth
다음과 같이 쉽게 대체/유래할 수 있습니다.
DATEADD(month, -1, @startOfCurrentMonth)
서버에서 현재 달의 시작을 도출해야 하는 경우 다음을 통해 수행할 수 있습니다.
DATEADD(month, DATEDIFF(month, 0, CURRENT_TIMESTAMP), 0)
이치노 번째 " " "DATEDIFF(...)
의 시작(즉, 시대의 시작은 현재 시대의 시작과 다릅니다.0001-01-01
- AD, CE 등), 기본적으로 큰 정수를 반환합니다.이것은 이 달의 시작까지의 월수입니다.그런 다음 이 숫자를 해당 월의 시작점에 추가합니다.
따라서 전체 스크립트는 다음과 같을 수 있습니다.
DECLARE @startOfCurrentMonth DATETIME
SET @startOfCurrentMonth = DATEADD(month, DATEDIFF(month, 0, CURRENT_TIMESTAMP), 0)
SELECT *
FROM Member
WHERE date_created >= DATEADD(month, -1, @startOfCurrentMonth)
AND date_created < @startOfCurrentMonth
따라서 모든 날짜 연산은 한 값에 대해 한 번만 수행됩니다. 옵티마이저는 인덱스를 자유롭게 사용할 수 있으며 잘못된 데이터는 포함되지 않습니다.
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()))
월과 연도를 확인해야 합니다.
지금까지 제공된 옵션을 추가하면 인덱스가 전혀 사용되지 않습니다.
이와 같은 방법으로 테이블에 있는 인덱스를 사용할 수 있습니다(있는 경우).
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
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 솔루션으로의 업그레이드입니다.이렇게 하면 YYY-MM-01에서 정확히 지난달에 입수할 수 있습니다.
지난달은 그 달의 마지막 날까지로 간주됩니다.여기서 2016년 1월 31일은 지난 30일과 비슷하지 않은 1월 31일이 될 것입니다.
SELECT CONVERT(DATE, DATEADD(DAY,-DAY(GETDATE()),GETDATE()))
이를 위한 한 가지 방법은 DATEPART 함수를 사용하는 것입니다.
select field1, field2, fieldN from TABLE where DATEPART(month, date_created) = 4
and DATEPART(year, date_created) = 2009
4월의 모든 날짜가 반환됩니다.지난달(즉, 이번 달 이전)에는 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()))
declare @PrevMonth as nvarchar(256)
SELECT @PrevMonth = DateName( month,DATEADD(mm, DATEDIFF(mm, 0, getdate()) - 1, 0)) +
'-' + substring(DateName( Year, getDate() ) ,3,4)
현재 달의 레코드만 가져오기 위한 SQL 쿼리
SELECT * FROM CUSTOMER
WHERE MONTH(DATE) = MONTH(CURRENT_TIMESTAMP) AND YEAR(DATE) = YEAR(CURRENT_TIMESTAMP);
SELECT * FROM Member WHERE month(date_created) = month(NOW() - INTERVAL 1 MONTH);
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()))
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
미스터 데니
전달의 마지막 날도 정확하게 기재되어 있습니다.
WHERE
date_created >= DATEADD(MONTH, DATEDIFF(MONTH, 31, CURRENT_TIMESTAMP), 0)
AND date_created < DATEADD(MONTH, DATEDIFF(MONTH, 0, CURRENT_TIMESTAMP), 0)
저는 Oracle env 출신입니다. Oracle에서는 다음과 같이 작업을 수행합니다.
select * from table
where trunc(somedatefield, 'MONTH') =
trunc(sysdate -INTERVAL '0-1' YEAR TO MONTH, 'MONTH')
아이디어: 지난달의 일정 보고서를 실행하고 있습니다(창이 없는 1일째부터 월말까지).이것은 지수에 비우호적일 수 있지만 Oracle은 어쨌든 빠른 날짜 처리를 가지고 있습니다.MS SQL에서도 마찬가지로 단순하고 짧은 방법이 있습니까?Oracle 사용자에게는 연도와 월을 구분하여 비교하는 답변이 어리석게 보입니다.
이 쿼리로 지난 달 레코드를 가져올 수 있습니다.
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)
받아들여지는 솔루션은 인덱스 친화적이라고 생각하지 않습니다.대신 다음 행을 사용합니다.
select * from dbtable where the_date >= convert(varchar(10),DATEADD(m, -1, dateadd(d, - datepart(dd, GETDATE())+1, GETDATE())),120) and the_date <= dateadd(ms, -3, convert(varchar(10),DATEADD(m, 0, dateadd(d, - datepart(dd, GETDATE())+1, GETDATE())),120));
또는 간단히 말하면(이것이 최고입니다).
select * from dbtable where the_date >= convert(varchar(10),DATEADD(m, -1, dateadd(d, - datepart(dd, GETDATE())+1, GETDATE())),120) and the_date < SELECT convert(varchar(10),DATEADD(m, -1, dateadd(d, - datepart(dd, GETDATE())+1, GETDATE())),120);
도움말
-- Get the first of last month
SELECT convert(varchar(10),DATEADD(m, -1, dateadd(d, - datepart(dd, GETDATE())+1, GETDATE())),120);
-- Get the first of current month
SELECT convert(varchar(10),DATEADD(m, -1, dateadd(d, - datepart(dd, GETDATE())+1, GETDATE())),120);
--Get the last of last month except the last 3milli seconds. (3miliseconds being used as SQL express otherwise round it up to the full second (SERIUSLY MS)
SELECT dateadd(ms, -3, convert(varchar(10),DATEADD(m, 0, dateadd(d, - datepart(dd, GETDATE())+1, GETDATE())),120));
뷰에 표시할 수 있도록 한 작업은 다음과 같습니다.
ALTER view [dbo].[MyView] as
with justdate as (
select getdate() as rightnow
)
, inputs as (
select dateadd(day, 1, EOMONTH(jd.rightnow, -2)) as FirstOfLastMonth
,dateadd(day, 1, EOMONTH(jd.rightnow, -1)) as FirstOfThisMonth
from justdate jd
)
SELECT TOP 10000
[SomeColumn]
,[CreatedTime]
from inputs i
join [dbo].[SomeTable]
on createdtime >= i.FirstOfLastMonth
and createdtime < i.FirstOfThisMonth
order by createdtime
;
뛰었는데요.getdate()
한번만.
최근 1개월 동안의 SQL 서버:
select * from tablename
where order_date > DateAdd(WEEK, -1, GETDATE()+1) and order_date<=GETDATE()
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
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)
유사한 문제를 수정하는 방법은 SELECT 부분에 Month를 추가하는 것입니다.
Month DATEADD(day,Created_Date,'1971/12/31') As Month
WHERE 문구를 추가했습니다.
Month DATEADD(day,Created_Date,'1971/12/31') = month(getdate())-1
만약 당신이 지난달을 찾고 있다면 이것을 사용해 보세요.
SELECT
FROM #emp
WHERE DATEDIFF(MONTH,CREATEDDATE,GETDATE()) = 1
만약 당신이 지난달을 찾고 있다면 이것을 사용해 보세요.
SELECT
FROM #emp
WHERE DATEDIFF(day,CREATEDDATE,GETDATE()) between 1 and 30
나에게 도움이 되는 간단한 질문은 다음과 같습니다.
테이블에서 *를 선택합니다.여기서 DATEADD(월, 1, DATEFIELD) > = getdate()
전월 데이터를 찾고 있는 경우:
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에서도 동작합니다.
언급URL : https://stackoverflow.com/questions/1424999/get-the-records-of-last-month-in-sql-server
'programing' 카테고리의 다른 글
WPF - Find Name이 null을 반환하지 않아야 할 때 null을 반환합니다. (0) | 2023.04.19 |
---|---|
Bash를 사용할 때 이스케이프해야 하는 문자는 무엇입니까? (0) | 2023.04.19 |
Swift: 빈 사전을 선언합니다. (0) | 2023.04.19 |
.gitignore가 일부 파일을 제외한 모든 파일을 무시하도록 합니다. (0) | 2023.04.19 |
Bash에서 파일을 효율적으로 변환하는 방법 (0) | 2023.04.19 |