DATETIME과 DATE 무시 시간 비율 비교
열에는 두 .[date]
입니다.DATETIME2(0)
.
두 레코드는 날짜 부분(일+월+년)만 비교하고 시간 부분(시간+분+초)은 무시해야 합니다.
내가 어떻게 그럴 수 있을까?
하다를 사용하세요.CAST
(新)으로DATE
SQL Server 2008:
IF CAST(DateField1 AS DATE) = CAST(DateField2 AS DATE)
Marc의 답변의 작은 단점은 두 날짜 필드가 모두 형식 캐스팅되었다는 것입니다. 즉, 인덱스를 활용할 수 없습니다.
따라서 날짜 필드에 인덱스의 이점을 얻을 수 있는 쿼리를 작성해야 하는 경우 다음과 같은(좀 복잡한) 접근법이 필요합니다.
- 인덱스된 날짜 필드(DF1)는 어떤 종류의 함수에서도 변경되지 않아야 합니다.
- 따라서 DF1을 DF2 요일의 datetime 값의 전체 범위와 비교해야 합니다.
- 이것은 DF2의 날짜 부분부터 DF2 이후의 날짜 부분까지입니다.
- ㅇㅇ.
(DF1 >= CAST(DF2 AS DATE)) AND (DF1 < DATEADD(dd, 1, CAST(DF2 AS DATE)))
- 메모: DF2의 날짜와의 비교는 >=(최소 허용)이며, DF2의 다음날에는 (최소 허용) <인 것이 매우 중요합니다.또한 BETWEEN 연산자는 양쪽에서 동일한 값을 허용하기 때문에 작동하지 않습니다.
PS: (구 버전의 SQL Server에서) 날짜만 추출하는 또 다른 방법은 내부적으로 날짜를 표시하는 방법을 사용하는 것입니다.
- 날짜를 플로트로 주조합니다.
- 부분 부분 잘라내기
- 값을 날짜/시간으로 다시 캐스트합니다.
- ㅇㅇ.
CAST(FLOOR(CAST(DF2 AS FLOAT)) AS DATETIME)
정답으로 표시된 답을 상향 투표했지만요.우연히 마주치는 사람을 위해 몇 가지 사항을 언급하고 싶었습니다.
일반적으로 날짜 값만 필터링하는 경우.Microsoft 에서는, 다음의 언어 중립 형식을 사용하는 것을 권장합니다.ymd
★★★★★★★★★★★★★★★★★」y-m-d
'2007-02-12' 형식은 DATE, DATETIME2 및 DATETIMEOFSET 데이터 유형에 대해서만 언어 중립으로 간주됩니다.
앞서 언급한 방법을 사용하여 날짜를 비교하는 것은 간단합니다.다음과 같은 인위적인 예를 생각해 봅시다.
--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
사용할 수 있습니다.DateDiff
낮과 비교합니다.
DateDiff(dd,@date1,@date2) > 0
즉,@date2 > @date1
예를 들어 다음과 같습니다.
select DateDiff(dd, '01/01/2021 10:20:00', '02/01/2021 10:20:00')
결과는 1 입니다.
MM/DD/YYYY와 같은 두 날짜를 MM/DD/YYY와 비교하기 위해 필드의 첫 번째 항목 열 유형은 dateTime이어야 합니다.예: columnName : payment_date dataType : DateTime 。
그 후에 쉽게 비교할 수 있습니다.쿼리:
select * from demo_date where date >= '3/1/2015' and date <= '3/31/2015'.
아주 간단해 ......테스트도 해봤고...
언급URL : https://stackoverflow.com/questions/1843395/compare-datetime-and-date-ignoring-time-portion
'source' 카테고리의 다른 글
Check Add 구속조건 뒤에 Check 구속조건 vs. 구속조건 추가 (0) | 2023.04.07 |
---|---|
SQL 스크립트에 오류가 있습니다.배치당 하나의 문만 허용됩니다. (0) | 2023.04.07 |
T-SQL에서 동일하지 않은 경우 != 또는 <> 중 어느 쪽을 사용해야 합니까? (0) | 2023.04.07 |
SQL Server의 테이블 이름이 "dbo"로 시작하는 이유는 무엇입니까? (0) | 2023.04.07 |
단일 SQL 쿼리에 여러 행을 삽입하시겠습니까? (0) | 2023.04.07 |