column [date]
이 type 인 두 개의 테이블 이 DATETIME2(0)
있습니다.
나는 시간 부분 (시 + 분 + 초)을 버리고 날짜 부분 (일 + 월 + 년)으로 만 두 레코드를 비교해야합니다.
어떻게해야합니까?
답변
SQL Server 2008 CAST
의 새로운 DATE
데이터 형식 을 사용하여 날짜 부분 만 비교하십시오.
IF CAST(DateField1 AS DATE) = CAST(DateField2 AS DATE)
답변
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)
답변
나는 정답으로 표시 된 답변을 상향 조정했지만. 나는 이것에 걸려 넘어지는 사람들을 위해 몇 가지 사항을 다루고 싶었다.
일반적으로 날짜 값만으로 특별히 필터링하는 경우 . 언어 중립적 형식의 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'.
매우 간단합니다. … 테스트했습니다 …..