programing

SQL Server에서 지난달의 레코드를 가져옵니다.

powerit 2023. 4. 19. 00:33
반응형

SQL Server에서 지난달의 레코드를 가져옵니다.

db table [member]필드 "date_created"를 기준으로 지난달 기록을 취득하고 싶습니다.

이를 위한 SQL은 무엇입니까?

자세한 내용은 지난달 - 2009년 1월 8일 ~2009년 31일

오늘이 2010년 3월 1일이라면 2009년 1월 12일부터 2009년 31일까지의 기록을 입수할 필요가 있습니다.

기존의 (실행중의) 모든 응답에는, 다음의 2개의 문제 중 하나가 있습니다.

  1. 검색 중인 열의 인덱스를 무시합니다.
  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

반응형