Development Tip

SQL Server에서 날짜 + 시간에서 날짜를 얻는 가장 효율적인 방법은 무엇입니까?

yourdevel 2020. 10. 23. 19:13
반응형

SQL Server에서 날짜 + 시간에서 날짜를 얻는 가장 효율적인 방법은 무엇입니까?


MS SQL 2000 및 2005에서 '2008-09-25 12:34:56'과 같은 날짜 시간이 주어지면 '2008-09-25'만 포함하는 날짜 시간을 얻는 가장 효율적인 방법은 무엇입니까?

여기에 복제 되었습니다 .


나는 이전에 Matt가 보여준 플로어 플로트 변환을 본 적이 없었 음을 인정해야합니다. 나는 이것을 테스트해야했다.

순수한 선택 (날짜와 시간을 반환하고 우리가 원하는 것이 아님), 여기에서 지배하는 솔루션 (floor-float), 여기에 언급 된 일반적인 '순진한'솔루션 (stringconvert) 및 여기에 언급 된 솔루션을 테스트했습니다. (내가 생각하기에 가장 빠르다고 생각했듯이).

최대 메모리 (32 비트, 약 3.5Gb)에서 실행되는 Xeon 3GHz CPU와 함께 Win 2003 SP2 서버에서 실행되는 테스트 서버 MS SQL Server 2005에서 쿼리를 테스트했습니다. 내가있는 밤이어서 기계가 거의 무부하 상태로 공회전합니다. 나는 나 자신에게 모든 것을 가지고있다.

다음은 밀리 초 수준까지 다양한 타임 스탬프를 포함하는 큰 테이블에서 선택한 테스트 실행의 로그입니다. 이 특정 데이터 세트에는 2.5 년 이상의 날짜가 포함됩니다. 테이블 자체에는 1 억 3 천만 개가 넘는 행이 있으므로 내가 상위 백만 개로 제한합니다.

SELECT TOP 1000000 CRETS FROM tblMeasureLogv2 
SELECT TOP 1000000 CAST(FLOOR(CAST(CRETS AS FLOAT)) AS DATETIME) FROM tblMeasureLogv2
SELECT TOP 1000000 CONVERT(DATETIME, CONVERT(VARCHAR(10), CRETS, 120) , 120) FROM tblMeasureLogv2 
SELECT TOP 1000000 DATEADD(DAY, DATEDIFF(DAY, 0, CRETS), 0) FROM tblMeasureLogv2

SQL Server 구문 분석 및 컴파일 시간 : CPU 시간 = 0ms, 경과 시간 = 1ms.

(영향을받는 행 1000000 개) 테이블 'tblMeasureLogv2'. 스캔 횟수 1, 논리적 읽기 4752, 물리적 읽기 0, 미리 읽기 0, lob 논리적 읽기 0, lob 물리적 읽기 0, lob 미리 읽기 0.

SQL Server 실행 시간 : CPU 시간 = 422ms, 경과 시간 = 33803ms.

(영향을받는 행 1000000 개) 테이블 'tblMeasureLogv2'. 스캔 횟수 1, 논리적 읽기 4752, 물리적 읽기 0, 미리 읽기 0, lob 논리적 읽기 0, lob 물리적 읽기 0, lob 미리 읽기 0.

SQL Server 실행 시간 : CPU 시간 = 625ms, 경과 시간 = 33545ms.

(영향을받는 행 1000000 개) 테이블 'tblMeasureLogv2'. 스캔 횟수 1, 논리적 읽기 4752, 물리적 읽기 0, 미리 읽기 0, lob 논리적 읽기 0, lob 물리적 읽기 0, lob 미리 읽기 0.

SQL Server 실행 시간 : CPU 시간 = 1953ms, 경과 시간 = 33843ms.

(영향을받는 행 1000000 개) 테이블 'tblMeasureLogv2'. 스캔 횟수 1, 논리적 읽기 4752, 물리적 읽기 0, 미리 읽기 0, lob 논리적 읽기 0, lob 물리적 읽기 0, lob 미리 읽기 0.

SQL Server 실행 시간 : CPU 시간 = 531ms, 경과 시간 = 33440ms. SQL Server 구문 분석 및 컴파일 시간 : CPU 시간 = 0ms, 경과 시간 = 1ms.

SQL Server 실행 시간 : CPU 시간 = 0ms, 경과 시간 = 1ms.

여기서 우리는 무엇을보고 있습니까?

CPU 시간 (변환을보고 있음)에 초점을 맞추면 다음과 같은 숫자가 있음을 알 수 있습니다.

Pure-Select:  422
Floor-cast:   625
String-conv: 1953
DateAdd:      531  

이것에서 DateAdd (적어도이 특정 경우)가 플로어 캐스트 방법보다 약간 빠릅니다.

가기 전에 쿼리 순서가 변경된 동일한 결과로이 테스트를 여러 번 실행했습니다.

이게 내 서버에서 뭔가 이상합니까?


Select DateAdd(Day, DateDiff(Day, 0, GetDate()), 0)

DateDiff (Day, 0, GetDate ())는 DateDiff (Day, '1900-01-01', GetDate ())와 동일합니다.

DateDiff는 정수를 반환하므로 1900 년 1 월 1 일 이후 경과 된 일 수를 얻습니다. 그런 다음 1900 년 1 월 1 일에이 정수 일 수를 더합니다. 순 효과는 시간 구성 요소를 제거하는 것입니다.

이 방법은 모든 날짜 / 시간 부분 (예 : 년, 분기, 월, 일,시, 분 및 초)에 대해 작동한다는 점도 언급해야합니다.

Select  DateAdd(Year, DateDiff(Year, 0, GetDate()), 0)
Select  DateAdd(Quarter, DateDiff(Quarter, 0, GetDate()), 0)
Select  DateAdd(Month, DateDiff(Month, 0, GetDate()), 0)
Select  DateAdd(Day, DateDiff(Day, 0, GetDate()), 0)
Select  DateAdd(Hour, DateDiff(Hour, 0, GetDate()), 0)
Select  DateAdd(Second, DateDiff(Second, '20000101', GetDate()), '20000101')

마지막 것은 몇 초 동안 특별한 처리가 필요합니다. 1900 년 1 월 1 일을 사용하면 오류가 발생합니다.

두 datetime 열의 차이로 인해 런타임에 오버플로가 발생했습니다.

다른 참조 날짜 (예 : 2000 년 1 월 1 일)를 사용하여이 오류를 피할 수 있습니다.


select cast(floor(cast(@datetime as float)) as datetime)

datetime을 float로 캐스팅하면 1900 년 1 월 1 일 이후의 일 수 (하루의 분수 포함)가 제공되기 때문에 작동합니다. 바닥재는 분수 일수를 제거하고 전체 일 수를 남긴 다음 datetime으로 다시 변환 할 수 있습니다.


SQL Server 2012 사용

select cast(getdate() as date)

select cast(getdate()as varchar(11))as datetime

YYYY-MM-DD를 얻으려면 다음을 사용하십시오.

select convert(varchar(10), getdate(), 120)

편집 : 죄송합니다, 그는 문자열 대신 DateTime을 원합니다. Oracle의 TRUNC ()에 해당합니다. 내가 게시 한 것을 가져 와서 DateTime으로 되돌릴 수 있습니다.

select convert(datetime, convert(varchar(10), getdate(), 120) , 120)

CONVERT, FLOOR 및 DATEDIFF는 동일하게 수행됩니다.

SQL Server datetime 데이터 형식에서만 날짜 부분을 반환하는 방법


아래 링크에 설명 된 세 가지 방법. 어떤 것이 가장 빠른지 결정하기 위해 성능을 테스트하지 않았습니다.

http://www.blackwasp.co.uk/SQLDateFromDateTime.aspx


CAST(FLOOR(CAST(yourdate AS DECIMAL(12, 5))) AS DATETIME) performs the best by far. you can see the proof & tests when getting the date without time in sql server


What About SELECT CAST(CASt(GETDATE() AS int) AS DATETIME)??


CONVERT(VARCHAR(10), GETDATE(), 120) AS [YYYY-MM-DD]

참고URL : https://stackoverflow.com/questions/133081/most-efficient-way-in-sql-server-to-get-date-from-datetime

반응형