시간 부분을 무시하고 DATETIME 및 DATE 비교


답변:


252

SQL Server 2008 CAST의 새로운 DATE데이터 형식 을 사용하여 날짜 부분 만 비교하십시오.

IF CAST(DateField1 AS DATE) = CAST(DateField2 AS DATE)

61

Marc의 대답에서 약간의 단점은 두 날짜 필드가 모두 유형 변환되어 인덱스를 활용할 수 없다는 것입니다.

따라서 날짜 필드의 인덱스에서 이점을 얻을 수있는 쿼리를 작성해야 할 경우에는 다음과 같은 (심지어 복잡한) 접근 방식이 필요합니다.

  • 인덱싱 된 날짜 필드 (DF1이라고 함)는 모든 종류의 기능으로 변경되지 않아야합니다.
  • 따라서 DF1을 DF2 날짜의 전체 날짜 시간 값 범위와 비교해야합니다.
  • 이는 DF2의 날짜 부분에서 DF2 다음 날의 날짜 부분까지입니다.
  • (DF1 >= CAST(DF2 AS DATE)) AND (DF1 < DATEADD(dd, 1, CAST(DF2 AS DATE)))
  • 참고 : 비교는 DF2 날짜와 > = (균등 허용), 그리고 DF2 다음날 < 엄격하게> < 매우 중요합니다 . 또한 BETWEEN 연산자는 양쪽에서 평등을 허용하므로 작동하지 않습니다.

추신 : 날짜를 추출하는 또 다른 방법 (이전 버전의 SQL Server에서)은 날짜가 내부적으로 어떻게 표현되는지에 대한 트릭을 사용하는 것입니다.

  • 날짜를 플로트로 캐스팅합니다.
  • 분수 부분 자르기
  • 값을 날짜 / 시간으로 캐스트
  • CAST(FLOOR(CAST(DF2 AS FLOAT)) AS DATETIME)

5

나는 정답으로 표시 된 답변을 상향 조정했지만. 나는 이것에 걸려 넘어지는 사람들을 위해 몇 가지 사항을 다루고 싶었다.

일반적으로 날짜 값만으로 특별히 필터링하는 경우 . 언어 중립적 형식의 ymd또는을 사용하는 것이 좋습니다 y-m-d.

'2007-02-12'형식은 DATE, DATETIME2 및 DATETIMEOFFSET 데이터 유형에 대해서만 언어 중립으로 간주됩니다.

위에서 언급 한 접근법을 사용하여 날짜를 비교하는 것은 간단합니다. 다음과 같이 고안된 예를 고려하십시오.

--112 is ISO format 'YYYYMMDD'
declare @filterDate char(8) = CONVERT(char(8), GETDATE(), 112)

select 
    * 
from 
    Sales.Orders
where
    CONVERT(char(8), OrderDate, 112) = @filterDate

완벽한 환경에서는 필터링 된 열에 대한 조작을 수행하지 않아야합니다. 이렇게하면 SQL Server가 인덱스를 효율적으로 사용하지 못할 수 있습니다. 즉, 저장하는 데이터가 날짜가 아닌 시간에만 관심이 있다면 DATETIME자정을 시간으로 저장하는 것이 좋습니다. 때문에:

SQL Server는 리터럴을 필터링 된 열 형식으로 변환 할 때 시간 부분이 표시되지 않은 자정을 가정합니다. 이러한 필터가 지정된 날짜의 모든 행을 리턴하도록하려면 자정을 시간으로하여 모든 값을 저장해야합니다.

따라서 날짜에만 관심이 있다고 가정하고 데이터를 그대로 저장하십시오. 위의 쿼리는 다음과 같이 단순화 될 수 있습니다.

--112 is ISO format 'YYYYMMDD'
declare @filterDate char(8) = CONVERT(char(8), GETDATE(), 112)

select 
    * 
from 
    Sales.Orders
where
    OrderDate = @filterDate

3

당신은 이것을 시도 할 수 있습니다

CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000')

다음 코드를 통해 MS SQL 2014에 대해 테스트합니다.

select case when CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000') then 'ok'
            else '' end

-3

같은 비교 두 개의 날짜를 MM / DD / YYYYMM / DD / YYYY . Field의 첫 번째 열 유형은 dateTime이어야합니다. 예 : columnName : payment_date dataType : DateTime 입니다.

그 후에는 쉽게 비교할 수 있습니다. 쿼리는 :

select  *  from demo_date where date >= '3/1/2015' and date <=  '3/31/2015'.

매우 간단합니다. ... 테스트했습니다 .....


이것은 질문에 대한 답이 아닙니다. 하루가 아닌 한 달 동안 쿼리합니다.
커티스 얄롭

3 월 쿼리의 경우 : 날짜가 '3/31/2015'시간 13:00 인 경우 찾을 수 없습니다. < '4/1/2015'를 사용해야합니다.
커티스 얄롭

국제 날짜 형식 '2015-03-01'도 사용하십시오. 캐나다 (및 기타 여러 장소)에서 공식 형식은 DD / MM / YYYY이며, 두 형식 모두 모호하고 문제가됩니다.
커티스 얄롭

이 답변은 질문에서 요청 한대로 2 개의 테이블을 처리하지 않습니다.
커티스

그렇습니다 나는 동의한다, 그러나 다만 국제적인 해결책이 아니라 해결책을 증명하는 메신저 .. 당신은 약간 순서를 바꾸어야한다…
pankaj
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.