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 때문에 선호 :
- varchar에는 언어 / 날짜 형식 문제가 있습니다.
예 : CASE식이 결정적이지 않은 이유는 무엇입니까? - float는 내부 저장소에 의존
- “0”기준을 변경하여 월의 첫날, 내일 등으로 확장됩니다.
2011 년 10 월 편집
SQL 서버 2008+의 경우에 CAST 수 있습니다 date
즉 CAST(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)