programing

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

padding 2023. 7. 7. 18:40
반응형

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

MS SQL 2000 및 2005에서 '2008-09-25 12:34:56'과 같은 날짜 시간을 고려할 때 '2008-09-25'만 포함된 날짜 시간을 얻는 가장 효율적인 방법은 무엇입니까?

여기 중복됨.

매트가 보여준 플로어-플로어-플로어 변환을 전에 본 적이 없다는 것을 인정해야 합니다.저는 이것을 시험해 봐야 했습니다.

저는 순수 선택(날짜와 시간을 반환할 것이며 우리가 원하는 것이 아님), 여기서 현재 사용 중인 솔루션(플로어 플로어 플로어 플로어 플로어), 여기서 언급된 일반적인 '순수한' 솔루션(스트링 변환) 및 여기서 사용 중인 솔루션(가장 빠르다고 생각했기 때문에)을 테스트했습니다.

최대 메모리(32비트, 약 3.5Gb)로 실행되는 Xeon 3GHz CPU가 있는 Win 2003 SP2 서버에서 실행되는 테스트 서버 MS SQL Server 2005에서 쿼리를 테스트했습니다.제가 있는 곳은 밤이라 기계가 거의 부하 없이 공회전하고 있습니다.제가 다 알아서 할게요.

다음은 밀리초 수준까지 다양한 타임스탬프가 포함된 큰 테이블에서 선택한 테스트 실행 로그입니다.이 데이터 세트에는 2.5년 이상의 날짜가 포함되어 있습니다.테이블 자체가 1억 3천만 줄이 넘습니다. 그래서 저는 상위 100만 줄로 제한합니다.

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입니다.

(100000000 행이 영향을 받음) 표 'tblMeasureLogv2'.검색 수 1, 논리적 읽기 4752, 물리적 읽기 0, 미리 읽기 0, 로브 논리적 읽기 0, 로브 물리적 읽기 0, 로브 미리 읽기 0입니다.

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

(100000000 행이 영향을 받음) 표 'tblMeasureLogv2'.검색 수 1, 논리적 읽기 4752, 물리적 읽기 0, 미리 읽기 0, 로브 논리적 읽기 0, 로브 물리적 읽기 0, 로브 미리 읽기 0입니다.

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

(100000000 행이 영향을 받음) 표 'tblMeasureLogv2'.검색 수 1, 논리적 읽기 4752, 물리적 읽기 0, 미리 읽기 0, 로브 논리적 읽기 0, 로브 물리적 읽기 0, 로브 미리 읽기 0입니다.

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

(100000000 행이 영향을 받음) 표 'tblMeasureLogv2'.검색 수 1, 논리적 읽기 4752, 물리적 읽기 0, 미리 읽기 0, 로브 논리적 읽기 0, 로브 물리적 읽기 0, 로브 미리 읽기 0입니다.

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

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

여기 뭐가 보여요?

CPU 시간(변환 중)에 중점을 두고, 다음과 같은 수치를 확인할 수 있습니다.

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

이를 보면 DateAdd(적어도 이 특정한 경우)가 Floor-cast 방법보다 약간 더 빠른 것 같습니다.

당신이 그곳에 가기 전에, 저는 이 테스트를 여러 번 실행했고, 쿼리의 순서가 바뀌었는데, 결과는 똑같습니다.

제 서버에 이상한 점이 있나요?

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일을 사용하면 오류가 발생합니다.

두 개의 날짜/시간 열 차이로 인해 런타임에 오버플로가 발생했습니다.

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

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

날짜 표시 시간을 지정하면 1900년 1월 1일 이후의 날짜 수(하루의 분수 포함)가 제공되기 때문에 작동합니다.바닥을 깔면 부분적인 일 수가 제거되고 전체 일 수가 남아 날짜가 지정된 시간으로 되돌아갈 수 있습니다.

SQL Server 2012에서 사용

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

YYY-MM-DD를 가져오려면 다음을 사용합니다.

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

편집: 문자열 대신 DateTime을 원합니다.Oracle의 TRUNK()와 동등한 값입니다.내가 게시한 내용을 DateTime으로 되돌릴 수 있습니다.

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

CONVERT, FLOOR 및 DATEIFF는 동일한 작업을 수행합니다.

SQL Server 날짜 시간 데이터 유형에서 날짜 부분만 반환하는 방법

아래 링크에 설명된 세 가지 방법이 있습니다.저는 어떤 것이 가장 빠른지 판단하기 위해 성능 테스트를 하지 않았습니다.

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

CAST(FLOOR(CAST(yourdate AS DECIMAL(12, 5))) AS DATETIME)지금까지 최고의 성능을 발휘합니다.당신은 sql server에서 시간 없이 날짜를 얻었을 때 증명과 테스트를 볼 수 있습니다.

» 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

반응형