source

DATETIME과 DATE 무시 시간 비율 비교

ittop 2023. 4. 7. 21:56
반응형

DATETIME과 DATE 무시 시간 비율 비교

열에는 두 .[date]입니다.DATETIME2(0).

두 레코드는 날짜 부분(일+월+년)만 비교하고 시간 부분(시간+분+초)은 무시해야 합니다.

내가 어떻게 그럴 수 있을까?

하다를 사용하세요.CAST(新)으로DATESQL 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

반응형