[sql] SQL Server에서 날짜 시간의 일부를 제거하는 가장 좋은 방법

SQL Server의 날짜 / 시간 필드에서 시간 부분을 제거 할 때 가장 좋은 성능을 제공하는 방법은 무엇입니까?

a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

또는

b) select cast(convert(char(11), getdate(), 113) as datetime)

두 번째 방법은 몇 가지 더 어느 쪽이든 바이트하지만 그 변환의 속도와 같은 중요하지 않을 수도 있습니다 보내 않습니다.

둘 다 매우 빠르지 만 수백 개 이상의 행을 처리 할 때 속도에 차이가있을 수 있습니까?

또한 SQL에서 datetime의 시간 부분을 제거하는 더 좋은 방법이 있습니까?



답변

엄밀히 말하면, 방법 a이 가장 자원 집약적입니다.

a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

너무 많은 시간을 할애하여 몇 백만 행에 걸쳐 동일한 총 지속 시간 동안 CPU 집약도가 입증되지 않았습니다. .

비슷한 결과를 가진 다른 곳에서도 비슷한 테스트를 보았습니다.

나는 DATEADD / DATEDIFF 때문에 선호 :

2011 년 10 월 편집

SQL 서버 2008+의 경우에 CAST 수 있습니다 dateCAST(getdate() AS date). 또는 date데이터 유형을 사용 하여 제거 할 시간이 없습니다.

2012 년 1 월 수정

이것이 얼마나 유연한 지에 대한 효과적인 예 : SQL Server에서 반올림 시간 또는 날짜 그림으로 계산해야 함

편집 : 2012 년 5 월호

생각없이 WHERE 절 등에서 이것을 사용하지 마십시오. 열에 함수 또는 CAST를 추가하면 인덱스 사용이 무효화됩니다. 여기 2 번을 참조하십시오 : http://www.simple-talk.com/sql/t-sql-programming/ten-common-sql-programming-mistakes/

이제 여기에는 CAST를 올바르게 관리하는 최신 SQL Server 옵티 마이저 버전의 예가 있지만 일반적으로 나쁜 생각입니다 …

datetime2의 2018 년 9 월 편집

DECLARE @datetime2value datetime2 = '02180912 11:45' --this is deliberately within datetime2, year 0218
DECLARE @datetime2epoch datetime2 = '19000101'

select DATEADD(dd, DATEDIFF(dd, @datetime2epoch, @datetime2value), @datetime2epoch)


답변

SQL Server 2008에서는 다음을 사용할 수 있습니다.

CONVERT(DATE, getdate(), 101)


답변

물론 이것은 오래된 스레드이지만 완료되도록합니다.

SQL 2008부터는 DATE 데이터 유형을 사용하여 간단하게 수행 할 수 있습니다.

SELECT CONVERT(DATE,GETDATE())


답변

SELECT CAST(FLOOR(CAST(getdate() AS FLOAT)) AS DATETIME)

아니 아래 의견에 따르면 좋은 해결책 .

나는이 답변을 삭제하지만, 여기에 반대 의견으로 남겨 두겠습니다. 그것이 좋은 아이디어가 아닌지에 대한 논평자의 설명 이 여전히 유용하다고 생각하기 때문입니다.


답변

SQL Server 2008에는 DATE 날짜 유형 (TIME 데이터 유형)이 있습니다.

CAST(GetDate() as DATE)

또는

declare @Dt as DATE = GetDate()


답변

또 다른 중복 질문의 또 다른 답변이 있습니다.

SELECT CAST(CAST(getutcdate() - 0.50000004 AS int) AS datetime) 

이 매직 넘버 방식은 DATEADD 방식보다 약간 빠릅니다. (~ 10 % 인 것 같습니다)

수백만 레코드의 CPU 시간 :

DATEADD   MAGIC FLOAT
500       453
453       360
375       375
406       360

그러나이 숫자는 이미 매우 빠르기 때문에 관련이 없을 수 있습니다. 레코드 세트가 100,000 이상이 아니라면 CPU 시간을 0 이상으로 읽을 수 없었습니다.

DateAdd가이 목적을위한 것이며보다 강력하다는 사실을 고려하면 DateAdd를 사용한다고합니다.


답변

SELECT CAST(CAST(GETDATE() AS DATE) AS DATETIME)