전날의 모든 행을 선택하는 SQL 문


120

한 테이블에서 전날의 모든 행을 선택하는 좋은 SQL 문을 찾고 있습니다. 테이블에는 하나의 datetime 열이 있습니다. SQL Server 2005를 사용하고 있습니다.

답변:


212

오늘은 시간이 없다 :

SELECT dateadd(day,datediff(day,0,GETDATE()),0)

어제 시간 없음 :

SELECT dateadd(day,datediff(day,1,GETDATE()),0)

어제의 모든 행에 대한 쿼리 :

select 
    * 
    from yourTable
    WHERE YourDate >= dateadd(day,datediff(day,1,GETDATE()),0)
        AND YourDate < dateadd(day,datediff(day,0,GETDATE()),0)

@ashuthinks, 귀하의 의견은 나에게 의미가 없습니다. 원래 질문은 전날에서 행을 가져 오는 방법을 묻습니다. 이를 위해서는 오늘 날짜 만 (시간 없음)과 어제 날짜 만 (시간 없음) 만 가져올 수 있어야합니다. 'WHERE'절에서이 (영원한) 날짜를 사용합니다. 그러나은 SELECT *원래 시간과 함께 모든 날짜를 반환합니다.
KM.

datediff는 "잘못된 매개 변수 수 오류"를 제공합니다. 및 stackoverflow.com/a/18926156/3007408은 DATEDIFF 만이 매개 변수를 사용할 수 있습니다 말한다. 어떤 해결책 ??
Sp0T

@ Sp0T,이 질문은 태그가 지정된 SQL Server 이며 세 가지 매개 변수 ( msdn.microsoft.com/en-us/library/ms189794.aspx ) 를 허용하는 DATEDIFF () 함수가 있는 질문은 MySql에 대한 것입니다. 발견 한대로 다르게 작동합니다. SQL은 완전히 상호 교환 할 수 없으며 특히 날짜 처리와 관련하여 여러 공급 업체간에 이와 같은 많은 차이점이 있음을 알 수 있습니다.
KM.

오, 감사합니다. 그것을 몰랐습니다. Btw 나는 "curdate () -1 day and curdate () 사이"를 사용하여 문제를 해결했습니다. 이 경우에도 사용할 수 있습니다.
Sp0T

1
@RasmusBidstrup, 네. 내가 달릴 때 나는 SELECT getdate(),dateadd(day,datediff(day,1,GETDATE()),0):2016-02-01 10:27:54.733 2016-01-31 00:00:00.000
KM.

44

SQL에서 "오늘"값을 얻으려면 :

convert(date, GETDATE())

"어제"를 얻으려면 :

DATEADD(day, -1, convert(date, GETDATE()))

"오늘 마이너스 X 일"을 얻으려면 -1을 -X로 변경하십시오.

따라서 어제의 모든 행에 대해 다음을 얻습니다.

select * from tablename
   where date >= DATEADD(day, -1, convert(date, GETDATE()))
   and date < convert(date, GETDATE())

SQL Server 2005에는 "날짜"데이터 유형이 없습니다. 대신 datetime을 사용하면 시간 값이 유지되고 계산이 오전 0 시부 터 오후 12 시까지가 아니라 쿼리를 실행 한 시간부터 발생합니다.
rudimenter

1
내 실수. 나는 당신이 SQL Server 2005를 다루는 것을 보지 못했습니다. 실제로 내 코드는 SQL Server 2008에서만 작동합니다.
Konamiman

저는 항상 DATEADD (day, ....)가 낭비라고 생각했습니다. 날짜에 대해 일 수를 더하거나 빼기 만하면됩니다. SELECT GETDATE ()-1
KM.

18

분명한 대답이 누락 된 것 같습니다. 열 (DatetimeColumn)이 타임 스탬프가있는 datetime 인 테이블 (Ttable)에서 모든 데이터를 가져 오려면 다음 쿼리를 사용할 수 있습니다.

SELECT * FROM Ttable
WHERE DATEDIFF(day,Ttable.DatetimeColumn ,GETDATE()) = 1 -- yesterday

오늘, 지난달, 작년 등으로 쉽게 변경할 수 있습니다.


3
이것은 꽤 잘 작동하지만 DatetimeColumn BETWEEN DATEADD(day, DATEDIFF(day, 1, GETDATE()) ,0) AND DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)각 행에서 DATEDIFF ()를 평가해야 하기 때문에 훨씬 더 비쌉니다
Václav Holuša


5

정말 오래된 실이지만 여기에 내 의견이 있습니다. 2 개의 다른 절이 아니라 하나는보다 크거나 작습니다. A 날짜에서 레코드를 선택하기 위해 아래 구문을 사용합니다. 날짜 범위를 원하면 이전 답변을 사용하는 것이 좋습니다.

SELECT * FROM TABLE_NAME WHERE 
DATEDIFF(DAY, DATEADD(DAY, X , CURRENT_TIMESTAMP), <column_name>) = 0

위의 경우 X는 어제 기록에 대해 -1이됩니다.


4

지금은 테스트 할 수 없지만 :

select * from tablename where date >= dateadd(day, datediff(day, 1, getdate()), 0) and date < dateadd(day, datediff(day, 0, getdate()), 0)

3

이렇게해야합니다.

WHERE `date` = CURDATE() - INTERVAL 1 DAY

1
(죄송합니다)하지만 당신의 대답은 MySQL의 호환 문제는 SQL 서버입니다
StefanJCollier

2

SQL Server에서 다음과 같이하십시오.

where cast(columnName as date) = cast(getdate() -1 as date)

시간 서식 문제를 방지하려면 식의 양쪽을 모두 날짜로 변환해야합니다.

간격을 더 자세히 제어해야하는 경우 다음과 같이 시도해야합니다.

declare @start datetime = cast(getdate() - 1 as date)
declare @end datetime = cast(getdate() - 1 as date)
set @end = dateadd(second, 86399, @end)

1

"어제"라고 말하는 또 다른 방법 ...

Select * from TABLE
where Day(DateField) = (Day(GetDate())-1)
and Month(DateField) = (Month(GetDate()))
and Year(DateField) = (Year(getdate()))

이것은 1 월 1 일과 매월 1 일에는 잘 작동하지 않을 것입니다. 그러나 즉석에서 효과적입니다.


1

글쎄, datetime 열을 날짜로 캐스팅하고 비교하는 것이 더 쉽습니다.

SELECT * FROM TABLE_NAME WHERE cast(COLUMN_NAME as date) = 
   dateadd(day,0, convert(date, getdate(), 105)) 

0

subdate (now (), 1) 어제 타임 스탬프를 반환합니다. 아래 코드는 어제 타임 스탬프가있는 모든 행을 선택합니다.

Select * FROM `login` WHERE `dattime` <= subdate(now(),1) AND `dattime` > subdate(now(),2)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.