답변:
Marc의 대답에서 약간의 단점은 두 날짜 필드가 모두 유형 변환되어 인덱스를 활용할 수 없다는 것입니다.
따라서 날짜 필드의 인덱스에서 이점을 얻을 수있는 쿼리를 작성해야 할 경우에는 다음과 같은 (심지어 복잡한) 접근 방식이 필요합니다.
(DF1 >= CAST(DF2 AS DATE)) AND (DF1 < DATEADD(dd, 1, CAST(DF2 AS DATE)))
추신 : 날짜를 추출하는 또 다른 방법 (이전 버전의 SQL Server에서)은 날짜가 내부적으로 어떻게 표현되는지에 대한 트릭을 사용하는 것입니다.
CAST(FLOOR(CAST(DF2 AS FLOAT)) AS DATETIME)
나는 정답으로 표시 된 답변을 상향 조정했지만. 나는 이것에 걸려 넘어지는 사람들을 위해 몇 가지 사항을 다루고 싶었다.
일반적으로 날짜 값만으로 특별히 필터링하는 경우 . 언어 중립적 형식의 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
당신은 이것을 시도 할 수 있습니다
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
같은 비교 두 개의 날짜를 MM / DD / YYYY 에 MM / DD / YYYY . Field의 첫 번째 열 유형은 dateTime이어야합니다. 예 : columnName : payment_date dataType : DateTime 입니다.
그 후에는 쉽게 비교할 수 있습니다. 쿼리는 :
select * from demo_date where date >= '3/1/2015' and date <= '3/31/2015'.
매우 간단합니다. ... 테스트했습니다 .....