codememo

SQL Server에서의 DateTime2와 DateTime

tipmemo 2023. 4. 8. 08:30
반응형

SQL Server에서의 DateTime2와 DateTime

어느 쪽입니까?

SQL Server 2008+에 날짜와 시간을 저장하는 권장 방법은 무엇입니까?

알고 한 채,하는지, 하다, 사용하다, 사용하다, 사용하다, 사용하다, 사용하다, 사용하다, 사용하다, 사용하다, 사용하다, 사용하다, 사용하다, 사용하다, 사용하다, 하다, 사용하다, 사용하다, 사용하다, 사용하다, 하다 등의 프랙티스 ?datetime2 ?그입니그?

MSDN datetime 문서에서는 datetime2 사용을 권장합니다.다음은 권장 사항입니다.

하다를 사용하세요.time,date,datetime2 ★★★★★★★★★★★★★★★★★」datetimeoffset을 사용법SQL Standard를 사용합니다.그것들은 더 휴대성이 좋다. time,datetime2 ★★★★★★★★★★★★★★★★★」datetimeoffset하다 datetimeoffset는 글로벌하게 전개된 어플리케이션에 대한 타임존 지원을 제공합니다.

datetime2에는 날짜 범위, 기본 소수 정밀도 및 사용자 지정 정밀도(옵션)가 있습니다.또, 유저 지정의 정밀도에 따라서는, 스토리지의 사용율이 저하하는 일이 있습니다.

DATETIME2 / ~ "//이며, " / 01 / 01" ~ "9999 / 12 / 31" 입니다.DATETIMEtype 1753-9999년만 합니다.

그리고 필요하다면DATETIME2하게 할 수3/3.DATETIME은 3/3 밀리초로 제한되어 있습니다.DATETIME은 1로 있습니다.DATETIME2100ns 100 100 、 100ns 。

모두 " "에 .System.DateTime - 가 없습니다.NET 는 net net net net net net net

선택사항이 있으시다면,DATETIME2가능한 한.이 기능을 사용하여 얻을 수 있는 이점은 없습니다.DATETIME(역호환성 제외) - 번거로움을 덜 수 있습니다(날짜가 범위를 벗어나 번거롭습니다).

)만 필요한 경우 DATE를 하십시오.DATE는 DATE와 합니다. 이 기능은 다음과 같습니다.DATETIME2할 수 . 할 수 . :-) 시간만 사용할 수 .TIME래서이이이입입입!!!!!!!!!!

datetime 2는 (이전 어플리케이션 호환성)을 제외한 대부분의 면에서 성공

  1. 보다 폭넓은 가치관
  2. 정확성 향상
  3. 스토리지 공간 축소(옵션 사용자 지정 정밀도가 지정된 경우)

SQL 날짜 및 시간 데이터 유형 비교 - datetime, datetime2, date,

다음 점에 유의해 주십시오

  • 구문
    • datetime2 [(초 단위 정밀도=> 스토리지 크기 아래 보기)]
  • 밀도 、 일일일
    • 0 ~ 7자리, 정확도는 100ns입니다.
    • 기본 정밀도는 7자리입니다.
  • 저장소 크기
    • 정밀도가 3 미만일 경우 6바이트
    • 정밀도 3 및 4의 경우 7바이트
    • 기타 정밀도는 모두 8바이트가 필요합니다.
  • DateTime2(3)는 DateTime과 자리수는 같지만 8바이트가 아닌 7바이트의 스토리지를 사용합니다(SQLHINS-DateTime VS DateTime2).
  • 자세한 내용은 datetime2 (Transact-SQL MSDN 기사)

이미지 소스 : MCTS 셀프 페이싱 트레이닝 키트 (시험 70-432) : Microsoft® SQL Server®2008 - 구현유지보수 제3장: 테이블 -> 레슨 1: 테이블 생성 -> 66페이지

@marc_s 및 @Adam_Poward에 동의합니다.DateTime2가 권장되는 방법입니다.날짜 범위가 넓고 정밀도가 높으며 (정밀도에 따라) 같거나 적은 스토리지를 사용합니다.

'어디서나'...'어디로 가는지...'
@@Marc_s 상태:Both types map to System.DateTime in .NET - no difference there이것은 맞지만, 반대는 사실이 아닙니다.날짜 범위 검색을 수행할 때 중요합니다(예: "2010년 5월 5일에 수정된 모든 레코드를 검색해 주세요.").

NET 전 netDatetime has has has has has has has has has has has has has has has has has has has 와 비슷한 범위와 정밀도를 DateTime2 .net Datetime 'SQL'까지DateTime암묵적인 반올림이 발생합니다.이전 SQLDateTime3번으로 나누다, ,,11:59:59.997하루의 끝에 다다를 수 있을 만큼 가깝습니다.더 높은 것은 다음날로 반올림된다.

다음을 시도해 보십시오.

declare @d1 datetime   = '5/5/2010 23:59:59.999'
declare @d2 datetime2  = '5/5/2010 23:59:59.999'
declare @d3 datetime   = '5/5/2010 23:59:59.997'
select @d1 as 'IAmMay6BecauseOfRounding', @d2 'May5', @d3 'StillMay5Because2msEarlier'

이 암묵적인 반올림을 회피하는 것이 Date Time2로 이행하는 중요한 이유입니다.날짜를 암묵적으로 반올림하면 혼동이 발생합니다.

거의 모든 답변과 코멘트는 찬반에는 무겁고 반대에는 가볍습니다.여기 지금까지의 모든 찬반과 (아래 2번에서) 단 한 번만 언급했거나 전혀 언급하지 않은 몇 가지 중요한 단점들을 요약해당 단점은 다음과 같습니다.

  1. 장점:

1.1. ISO 준거 강화(ISO 8601) (실제로 어떻게 기능하는지는 모르겠지만)

1.2. 더 많은 범위(1/1/0001~12/31/9999 대 1/1/1753~12/31/9999)(1753년 이전) (단, 추가 범위는 모두 역사, 천문, 지질학 등의 응용 프로그램 이외에는 사용되지 않을 수 있습니다.)

.1.3의 와 정확히 합니다.네 netDateTime타입의 범위(값이 타겟타입의 범위내에 있는 경우는, 양쪽 모두 특별한 코드 없이 앞뒤로 변환합니다만, 그렇지 않으면 에러/반올림이 발생합니다.

1.4. 정밀도 향상(100나노초/1초 대 3.33밀리초/0.003,33초) (단, 초정밀은 엔지니어링/과학 애플리케이션 이외에는 사용되지 않을 수 있습니다).

1.5. Iman Abidi가 주장한 것과 같은 정밀도(1밀리섹과 동일하지 않음(3.33밀리섹과 동일하지 않음)로 구성되었을 때DateTime는 공간을 적게 사용하지만(7바이트 대 8바이트), 물론 가장 널리 알려진 두 가지 중 하나(다른 하나는 필요 없는 이점)인 정확한 이점을 잃게 됩니다.

  1. 단점:

2.를 .2.1에 할 때. 물 netSqlCommand, 을System.Data.SqlDbType.DateTime2 Server Server DateTime및 정밀도 그 모두)는로 「/」( 「」)로 설정되어 있기 입니다.System.Data.SqlDbType.DateTime.

2.2. 숫자 값 및 연산자를 사용하여 SQL Server 식에서 다음 작업을 수행하는 부동 소수점 숫자(최소 날짜 시간 이후 일수) 값으로 암묵적으로 쉽게 변환할 수 없습니다.

.2일수를 빼다.2.2.1 일수로 . 사용방법: " " "DateAdd날짜의 전부는 아니더라도 여러 가지를 고려해야 할 경우 회피책으로 기능하는 것은 간단하지 않습니다.

"나이" 두 .2.2.2 "나이"를 계산한다"SQL Server"는 단순히 할 수 .DateDiff기능합니다.입니다.age대부분의 사람들이 예상하는 것처럼 두 개의 날짜 시간이 지정된 단위의 달력/시계 날짜/시간 경계를 넘어설 경우 그 단위의 1 대 0으로 그 차이를 반환합니다.를 들면, 「」는,DateDiffDay2개의 날짜 시간 간격이 1밀리초밖에 없는 경우, 그 날짜 시간이 다른 날짜(예: "1999-12-31 23:59:59.999999" 및 "2000-01 00:00:00.00000")일 경우 1과 0(일)을 반환합니다.하면 1밀리초의 됩니다.Day0(으)ㄹ 수 있다.

2. 2.2.하세요.Avg변환한 후 "Float"으로 변환하여 Query을 지정합니다.DateTime.

:: " " " "DateTime2수치로 계산하면 다음과 같은 공식에 따라 값이 1970년보다 작지 않다고 가정해야 합니다(즉, 추가 범위와 217년을 모두 잃게 됩니다).주의: 숫자 오버플로우 문제가 발생할 수 있으므로 추가 범위를 허용하도록 수식을 단순히 조정하지 못할 수 있습니다.

25567 + (DATEDIFF(SECOND, {d '1970-01-01'}, @Time) + DATEPART(nanosecond, @Time) / 1.0E + 9) / 86400.0– 출처:"https://siderite.dev/how-to-sql-to.https"

, 신, 신, 가능합니다.Cast로로 합니다.DateTime에는 다시 )DateTime2범위를 DateTime2 ★★DateTime이는 가장 큰 2개이며, 동시에 가장 덜 필요한 2개이기도 합니다.따라서 덧셈/뺄셈/연령을 위해 부동소수)을 위해 부동소수점 숫자로의 암묵적/간단한 변환(일수)을 잃었을 때 왜 그것을 사용하는지에 대한 의문이 생깁니다. DateDiff) /Avg「Calcs」의 메리트는 "Calcs" 입니다.

데 b b bAvgdate-time은 중요한 사용 사례입니다.a) date-time(공통 기준 날짜-time)을 사용하여 기간을 나타낼 때(일반적인 관행), b) Rows 범위/그룹의 날짜-time 열에 있는 평균 날짜-time에 대한 대시보드 유형의 통계를 얻는 것도 유용합니다.c) 컬럼의 값을 감시/트러블 슈팅하기 위한 표준(또는 적어도 표준이 되어야 한다) 애드혹쿼리는 유효기간이 지났거나 무효가 될 수 있는 컬럼 내의 값을 감시/트러블 슈팅하기 위한 표준으로 발생 횟수 및 (사용 가능한 경우)를 값별로 나열하는 것입니다.Min,Avg ★★★★★★★★★★★★★★★★★」Max해당 값과 관련된 날짜 타임스탬프

다음은 스토리지 크기(바이트)와 smaldatetime, datetime, datetime2(0) 및 datetime2(7) 간의 정밀도 차이를 보여 주는 예입니다.

DECLARE @temp TABLE (
    sdt smalldatetime,
    dt datetime,
    dt20 datetime2(0),
    dt27 datetime2(7)
)

INSERT @temp
SELECT getdate(),getdate(),getdate(),getdate()

SELECT sdt,DATALENGTH(sdt) as sdt_bytes,
    dt,DATALENGTH(dt) as dt_bytes,
    dt20,DATALENGTH(dt20) as dt20_bytes,
    dt27, DATALENGTH(dt27) as dt27_bytes FROM @temp

이 값은 반환됩니다

sdt                  sdt_bytes  dt                       dt_bytes  dt20                 dt20_bytes  dt27                         dt27_bytes
-------------------  ---------  -----------------------  --------  -------------------  ----------  ---------------------------  ----------
2015-09-11 11:26:00  4          2015-09-11 11:25:42.417  8         2015-09-11 11:25:42  6           2015-09-11 11:25:42.4170000  8

따라서 밀리초가 아닌 두 번째까지 정보를 저장하려는 경우 datetime 또는 datetime2(7) 대신 datetime2(0)를 사용하면 각각 2바이트를 절약할 수 있습니다.

DateTime2는 해당 필드에 Now()를 쓰려고 하는 Access 개발자라면 큰 피해를 줍니다.방금 Access -> SQL 2008 R2의 이행을 실시했는데, 모든 datetime 필드가 DateTime2로 되어 있습니다.Now()를 사용하여 값을 blombout으로 하여 레코드를 추가합니다.2012년 1/1 오후 2:53:04에는 괜찮았지만, 2012년 1/10 오후 2:53:04에는 문제가 없었습니다.

한번 캐릭터가 변화를 만들어 냈습니다.도움이 됐으면 좋겠네요

오래된 질문...하지만 여기 계신 분 중에 아직 언급되지 않은 것을 덧붙이고 싶습니다.(주의: 이것은 제 자신의 관찰이므로, 참조를 요구하지 마십시오.)

필터 기준에 Datetime2를 사용하는 것이 더 빠릅니다.

TLDR:

SQL 2016에서는 10만 행의 테이블과 ENTERTY_ 날짜 열이 있었습니다.TIME은 정확한 시간을 최대 초까지 저장해야 했기 때문입니다.다수의 join과 하위 쿼리를 사용하여 복잡한 쿼리를 실행하는 동안 where 구를 다음과 같이 사용했을 때:

WHERE ENTRY_TIME >= '2017-01-01 00:00:00' AND ENTRY_TIME < '2018-01-01 00:00:00'

수백 개의 행이 있을 때는 쿼리가 처음에는 정상이었지만 행 수가 증가하면 쿼리에서 다음 오류가 발생하기 시작했습니다.

Execution Timeout Expired. The timeout period elapsed prior
to completion of the operation or the server is not responding.

where 구를 삭제했더니 예기치 않게 쿼리가 1초 만에 실행되었는데, 모든 날짜에 대한 모든 행을 가져왔습니다.where 절을 사용하여 내부 쿼리를 실행했는데 85초 걸리고 where 절을 사용하지 않으면 0.01초 걸렸어요.

문제로 인해 Datetime 필터링 성능으로 많은 스레드를 발견했습니다.

쿼리를 조금 최적화했습니다.그러나 실제 속도는 datetime 열을 datetime 2로 변경하는 것입니다.

이전에 타임아웃된 쿼리는 1초도 걸리지 않습니다.

건배.

을 ""로 "datetime ★★★★★★★★★★★★★★★★★」datetime2 이외의 것을 수 .DATEFORMAT예를 들면

set dateformat dmy
declare @d datetime, @d2 datetime2
select @d = '2013-06-05', @d2 = '2013-06-05'
select @d, @d2

값은 반환됩니다.2013-05-06 5월의 경우datetime , , , , 입니다.2013-06-05 5일)의 datetime2,에서는dateformatmdy둘 다, 둘 다@d ★★★★★★★★★★★★★★★★★」@d22013-06-05.

datetime동작은 MSDN 문서와 모순되는 것으로 보입니다.SET DATEFORMAT어떤 상태입니까?ISO 8601과 같은 일부 문자열 형식은 DATEFORMAT 설정과 독립적으로 해석됩니다.분명히 사실이 아니야!

가 이 에 물리기 까지 난 항상 yyyy-mm-dd언어/로케일 설정에 관계없이 날짜는 올바르게 처리됩니다.

datetime2의 정밀도가 높아지는 동안 일부 클라이언트는 날짜, 시간 또는 datetime2지원하지 않아 문자열 리터럴로 변환해야 합니다.특히 Microsoft에서는 이러한 데이터 유형의 ODBC, OLE DB, JDBC 및 SqlClient 문제에 대해 언급하고 있으며 각 데이터 유형의 매핑 방법을 보여 주는 차트를 제공합니다.

정확도보다 호환성이 높은 경우 datetime 사용

기사에 따르면 DateTime2를 사용하여 DateTime의 정밀도를 동일하게 하려면 DateTime2(3)를 사용하면 됩니다.이렇게 하면 동일한 정밀도를 얻을 수 있고 1바이트를 적게 차지하여 범위를 확장할 수 있습니다.

연연 for의 장점이 하나 더 생겼다.DATETIME2: : Python 의adodbapi " " " " " " " 가 .datetime되며, 이 아닌 으로 지정됩니다.DATETIME은 정상적으로 기능하지만 이 '하다'로 되어 있는 합니다.DATETIME2.

에서 알 수 있듯이datetime2는 크기가 작고 정밀도가 높기 때문에 권장되지만 Nikola Ilic의 datetime2를 사용하지 않는 이유에 대해서는 다음과 같이 설명합니다.

  • 할 수 있는 ( 결여되어 예를 들어 날짜로 기초연산을 할 이 없습니다.GETDATE()+1
  • 비교할 때마다DATEADD ★★★★★★★★★★★★★★★★★」DATEDIFFdatetime
  • 최적의 쿼리 계획이 아닌 데이터 저장 방식으로 인해 SQL Server가 Datetime2 열에 대한 통계를 제대로 사용할 수 없으므로 성능이 저하됩니다.

생각에는DATETIME2합니다.date는, 그, , 다, 다 효율이 높기 DATETIMESQL Server 2008 하면 .DATETIME2 및하고 6-8 이 소요됩니다bytes100 nanoseconds 보다 로 하는 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★DATETIME2.

접수된 답변은 훌륭합니다.프런트 엔드에 Date Time2를 송신하는 경우는, 통상의 Date Time에 상당하는 반올림 됩니다.

제 솔루션에서는 재투고시에 송신된 것과 데이타베이스에 있는 것을 비교해야 하고, 간단한 비교 「==」에서는 반올림 할 수 없었기 때문에 곤란했습니다.그래서 추가해야만 했다.

datetime2가 좋다

  • datetime 범위: 1753-01-01 ~9999-12-31, datetime2 범위: 0001-01-01 ~9999-12-31

  • datetime 정확도: 0.00333초, datetime2 정확도: 100나노초

  • datetime get 8 bytes, datetime 2 get 6 ~8 bytes는 사전 설정에 따라 달라집니다.

    (정밀이 3 미만일 경우 6바이트, 정밀도 3 또는 4일 경우 7바이트, 기타 모든 정밀도는 8바이트가 필요합니다.아래 그림을 클릭하여 확인합니다.)

여기에 이미지 설명 입력

Select ValidUntil + 1
from Documents

위의 SQL은 DateTime2 필드에서는 동작하지 않습니다."Operand type clash: datetime2가 int와 호환되지 않습니다."라는 오류가 반환됩니다.

다음 날에 1을 더하는 것은 개발자들이 수년간 데이트에 대해 해온 일입니다.이제 Microsoft에는 이 간단한 기능을 처리할 수 없는 새로운 datetime2 필드가 있습니다.

"구형보다 더 나쁜 이 신형을 쓰자"고 나는 생각하지 않아!

언급URL : https://stackoverflow.com/questions/1334143/datetime2-vs-datetime-in-sql-server

반응형