SQL Server에서 날짜/시간 중 일부를 제거하는 최선의 방법
SQL Server의 datetime 필드에서 시간 부분을 제거할 때 최적의 성능을 제공하는 방법은 무엇입니까?
a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
또는
b) select cast(convert(char(11), getdate(), 113) as datetime)
두 번째 방법에서는 어느 쪽이든 몇 바이트를 더 보내지만 변환 속도만큼 중요하지 않을 수 있습니다.
둘 다 매우 빠른 것처럼 보이지만, 수십만 개 이상의 열을 처리할 때 속도에 차이가 있을 수 있습니다.
또한 SQL에서 날짜의 시간 부분을 제거할 수 있는 더 좋은 방법이 있을까요?
메서드 「Method 「」, 「Method 「Method」입니다.a리소스 사용량이 가장 적습니다.
a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
많은 시간을 할애하고 있는 사람에 의해, 같은 합계 100만 행의 CPU 부하가 낮은 것이 실증되었습니다.SQL Server에서 날짜+시간에서 날짜를 가져오는 가장 효율적인 방법?
다른 곳에서도 비슷한 테스트를 봤는데 결과가 비슷해요.
다음과 같은 이유로 DATE ADD/DATEFF를 선호합니다.
- 는 언어 형식의 문제가.varchar는 언어/날짜 형식의 문제입니다.
예:왜 나의 CASE 표현은 결정적이지 않은가? - float는 내부 스토리지에 의존합니다.
- "0" 베이스를 변경하여 월 첫째 날, 내일 등의 운동으로 확장됩니다.
편집, 2011년 10월
2008+의 SQL Server 2008+ CAST:date ㅇㅇㅇ.CAST(getdate() AS date)또는 그냥 사용하세요.date no ' 데이터 타입'time제거할 수 있습니다.
편집, 2012년 1월
이것이 얼마나 유연한지를 보여주는 작업 예: SQL 서버의 반올림 시간 또는 날짜 수치를 사용하여 계산해야 합니다.
편집, 2012년 5월
WHERE 절 등에서는 이 명령어를 아무 생각 없이 사용하지 마십시오.컬럼에 함수 또는 CAST를 추가하면 인덱스 사용이 무효화됩니다.SQL 프로그래밍의 일반적인 오류 2번을 참조하십시오.
최신 버전의 SQL Server Optimizer가 CAST를 올바르게 관리하고 있는 예는 있습니다만, 일반적으로는 좋지 않습니다.
편집, 2018년 9월, datetime2에 대하여
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())
SQL Server 2008에는 DATE 데이터 유형(TIME 데이터 유형도 있음)이 있습니다.
CAST(GetDate() as DATE)
또는
declare @Dt as DATE = GetDate()
SELECT CAST(FLOOR(CAST(getdate() AS FLOAT)) AS DATETIME)
...아래의 코멘트에 의하면, 좋은 솔루션이 아닙니다.
이 답변은 삭제하겠습니다만, 왜 좋지 않은지에 대한 코멘트의 설명은 아직 유효하다고 생각하기 때문에, 반례로서 여기에 남겨 두겠습니다.
다음은 또 다른 중복 질문의 답변입니다.
SELECT CAST(CAST(getutcdate() - 0.50000004 AS int) AS datetime)
이 매직넘버 방식은 DATEADD 방식보다 약간 빠르게 동작합니다.(~10%)
여러 라운드의 백만 레코드 CPU 시간:
DATEADD MAGIC FLOAT
500 453
453 360
375 375
406 360
그러나 이러한 수치는 이미 매우 빠르기 때문에 관련이 없을 수 있습니다.10만 이상의 레코드 세트가 없으면 CPU Time을 0 이상으로 읽을 수 없습니다.
DateAdd가 이 목적을 위한 것이며 보다 견고한 것을 고려하면 DateAdd를 사용하는 것이 좋습니다.
SELECT CAST(CAST(GETDATE() AS DATE) AS DATETIME)
정말 마음에 들어요.
[date] = CONVERT(VARCHAR(10), GETDATE(), 120)
120ISO 8601을 사용합니다.
'YYYY-MM-DD' or '2017-01-09'
Dplyr'('Dplyr')로 매우 하기 쉽다.R팬더Python )!!
주의하세요!
메서드 a)와 b)의 출력이 항상 같은 것은 아닙니다.
select DATEADD(dd, DATEDIFF(dd, 0, '2013-12-31 23:59:59.999'), 0)
★★★★★2014-01-01 00:00:00.000
select cast(convert(char(11), '2013-12-31 23:59:59.999', 113) as datetime)
★★★★★2013-12-31 00:00:00.000
(MS SQL Server 2005 및 2008 R2에서 테스트 완료)
편집: Adam의 코멘트에 따르면 테이블에서 날짜 값을 읽을 경우 이 문제가 발생할 수 없습니다.단, 날짜 값을 리터럴(예: ADO를 통해 호출되는 저장 프로시저의 매개 변수)로 제공하면 문제가 발생할 수 있습니다.네트워크)
이치노
SQL Server 서에시 / sql sql sql sql sql sql sql sql sql sql sql sql sql sql sql sql sql sql sql sql?
무슨 일이 있어도 현악기 쓰지 마세요.그게 네가 할 수 있는 가장 나쁜 방법이야.
이미 대답했지만 이것도 버려야겠다...이것은 또한 잘 준비되지만, 플로트에서 소수점(시간을 저장하는 것)을 버리고 전체 부분(날짜)만 반환함으로써 작동한다.
CAST(
FLOOR( CAST( GETDATE() AS FLOAT ) )
AS DATETIME
)
두 번째로 이 해결책을 찾았을 때...나는 이 코드를 떼어냈다.
CAST(round(cast(getdate()as real),0,1) AS datetime)
이 메서드는 문자열 함수를 사용하지 않습니다. Date는 기본적으로 10진수 이전의 숫자가 하루의 일부인 실제 데이터 유형입니다.
이게 더 빠를 것 같아요.
아래 코드는 항상 승자입니다.
SELECT CONVERT(DATETIME, FLOOR(CONVERT(FLOAT,GETDATE())));
CONVERT(char(10), GetDate(), 126)를 선택합니다.
처음부터 삽입/업데이트의 제거 시간입니다.온더플라이 변환에 관해서는 사용자 정의 함수를 유지관리 측면에서 능가할 수 있는 것은 없습니다.
select date_only(dd)
「 」의 date_only을 사용하다이제 추상화되어 발신 코드가 훨씬 깨끗해졌습니다.
에 너는 내 i i i i i를 말하는 것 같아.cast(floor(cast(getdate()as float))as datetime)
real은 32비트밖에 되지 않기 때문에 정보가 손실될 수 있습니다.
빨라요cast(cast(getdate()+x-0.5 as int)as datetime)
빨라졌지만...,, 1010 % 속(about 0.49 microseconds CPU vs. 0.58)
제에서도 같은 이 소요됩니다.DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
SQL 2008에서 SQL CLR 함수는 SQL 함수를 사용하는 것보다 약 5배 빠릅니다.즉, SQL CLR 함수의 함수 호출 오버헤드가 단순한 SQL UDF에 비해 훨씬 낮습니다.
SQL 2005에서는 SQL CLR 함수가 테스트에 따르면 다음과 같은 느린 함수와 비교하여 16배 더 빠릅니다.
create function dateonly ( @dt datetime )
returns datetime
as
begin
return cast(floor(cast(@dt as float))as int)
end
어때.select cast(cast my_datetime_field as date) as datetime)이 경우 날짜는 00:00로 설정되지만 텍스트로 변환되지 않으며 명시적으로 숫자를 반올림하지 않습니다.
엄밀히 말하면TSQL이것이 시간을 단축하는 가장 빠른 방법입니다.
select convert(datetime,convert(int,convert(float,[Modified])))
이 잘라내는 방법이 다른 시스템보다 약 5% 더 빠르다는 것을 발견했습니다.DateAdd방법.이 값은 다음과 같이 가장 가까운 날짜로 반올림하도록 쉽게 수정할 수 있습니다.
select convert(datetime,ROUND(convert(float,[Modified]),0))
여기에서는 SQL Server의 datetime 일부를 삭제하는 함수를 만들었습니다.사용방법:
- 첫 번째 파라미터는 삭제할 날짜 시간입니다.
- 두 번째 매개 변수는 문자입니다.
- s: 초수로 반올림, 밀리초 삭제
- m: 분으로 반올림, 초 및 밀리초 삭제
- h: 시간 단위로 반올림하고 분, 초 및 밀리초를 삭제합니다.
- d: 일수로 반올림.시간, 분, 초 및 밀리초를 삭제합니다.
- 새 날짜/시간을 반환합니다.
create function dbo.uf_RoundDateTime(@dt as datetime, @part as char) returns datetime as begin if CHARINDEX( @part, 'smhd',0) = 0 return @dt; return cast( Case @part when 's' then convert(varchar(19), @dt, 126) when 'm' then convert(varchar(17), @dt, 126) + '00' when 'h' then convert(varchar(14), @dt, 126) + '00:00' when 'd' then convert(varchar(14), @dt, 112) end as datetime ) end
위 버전 중 몇 개가 작동하지 않았기 때문에 Sybase 버전을 찾고 있는 사람이 있는지 확인합니다.
CAST(CONVERT(DATE,GETDATE(),103) AS DATETIME)
- Adaptive Server 15.7에서 실행되는I SQL v11에서 테스트 완료
가능하면 이런 특별한 용도로는 CLR 기능을 사용하고 싶습니다.
이 경우:
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlDateTime DateOnly(SqlDateTime input)
{
if (!input.IsNull)
{
SqlDateTime dt = new SqlDateTime(input.Value.Year, input.Value.Month, input.Value.Day, 0, 0, 0);
return dt;
}
else
return SqlDateTime.Null;
}
개인적으로는 SQL Server 2005(또는 이전 버전)를 취급하는 경우에는 거의 항상 이 기능에 사용자 정의 함수를 사용합니다.단, 특히 UDF를 WHERE 절에 적용하는 경우에는 UDF를 사용하는 데 특별한 단점이 있습니다(자세한 내용은 아래 및 이 답변에 대한 코멘트 참조).SQL Server 2008(또는 그 이후)을 사용하는 경우 - 아래를 참조하십시오.
실제로 작성하는 대부분의 데이터베이스에서는 UDF가 조만간 필요할 가능성이 99%라는 것을 알기 때문에 UDF를 거의 처음부터 추가합니다.
'날짜만'과 '시간만'용으로 작성했습니다(둘 중 '날짜만'이 단연 가장 많이 사용됩니다).
다음은 다양한 날짜 관련 UDF에 대한 링크입니다.
SQL Server의 필수 날짜, 시간 및 날짜 시간 함수
날짜만 가져오기 기능
이 마지막 링크는 날짜 필드의 일부만 가져오는 3가지 이상의 방법을 보여 주며 각 접근법의 장단점을 언급합니다.
UDF를 사용하는 경우 쿼리 내 WHERE 구의 일부로 UDF를 사용하는 것은 피해야 합니다.이는 쿼리의 퍼포먼스를 크게 저해하기 때문입니다.그 주된 이유는 WHERE 절에서 UDF를 사용하면 해당 절이 비사거블이 되기 때문입니다.즉, SQL Server는 쿼리 실행 속도를 향상시키기 위해 해당 절과 함께 인덱스를 사용할 수 없게 됩니다.자신의 UDF 사용에 관해서는 WHERE 절 내에서 "raw" date column을 자주 사용하지만 SELECTed column에는 UDF를 적용합니다.이와 같이 UDF는 필터링된 결과 세트에만 적용되며 필터의 일부로 테이블의 모든 행에 적용되지 않습니다.
물론 SQL Server 2008(또는 그 이후)을 사용하여 날짜와 시간을 구분하는 것이 가장 좋은 방법입니다.SQL Server 데이터베이스 엔진은 개별 날짜와 시간 컴포넌트를 기본적으로 제공합니다.UDF 또는 기타 메커니즘이 복합 날짜 시간 유형에서 날짜 또는 시간 부분을 추출할 필요 없이 개별적으로 효율적으로 쿼리를 수행할 수 있습니다.
다음을 사용합니다.
CAST
(
CAST(YEAR(DATEFIELD) as varchar(4)) + '/' CAST(MM(DATEFIELD) as varchar(2)) + '/' CAST(DD(DATEFIELD) as varchar(2)) as datetime
)
따라서 이미 가지고 있는 날짜 필드에서 새 필드를 효과적으로 작성할 수 있습니다.
언급URL : https://stackoverflow.com/questions/1177449/best-approach-to-remove-time-part-of-datetime-in-sql-server
'source' 카테고리의 다른 글
| 지시문 @Input 필요 (0) | 2023.04.24 |
|---|---|
| Flexbox: 가로와 세로 중앙 (0) | 2023.04.24 |
| 스타일과 ControlTemplate의 차이점 (0) | 2023.04.24 |
| 서브타원 svn: 무시 (0) | 2023.04.24 |
| 셀의 텍스트 양에 관계없이 표 열 너비를 일정하게 설정하시겠습니까? (0) | 2023.04.24 |