SQL Server의 DateTime2와 DateTime


762

어느 것:

이다 SQL 서버 2008+에 저장 날짜와 시간에 권장되는 방법은?

나는 정밀도 (및 저장 공간)의 차이를 알고 있지만 현재는 무시하고 있습니다. 무엇을 사용 해야하는지, 아니면 우리가 사용해야 할 때에 대한 모범 사례 문서가 datetime2있습니까?

답변:


641

대한 MSDN 문서 날짜는 사용을 권장 DATETIME2를 . 추천은 다음과 같습니다.

새로운 작업 time에는 date, datetime2datetimeoffset데이터 유형을 사용하십시오 . 이러한 유형은 SQL 표준과 일치합니다. 그들은 더 휴대용입니다. time, datetime2datetimeoffset 초 이상 정밀도를 제공한다. datetimeoffset전 세계적으로 배포 된 응용 프로그램에 대한 표준 시간대 지원을 제공합니다.

datetime2에는 더 큰 날짜 범위, 더 큰 기본 분수 정밀도 및 선택적 사용자 지정 정밀도가 있습니다. 또한 사용자가 지정한 정밀도에 따라 더 적은 스토리지를 사용할 수 있습니다.


46
datetime2의 정밀도는 향상되었지만 일부 클라이언트는 날짜, 시간 또는 datetime2를 지원하지 않으며 문자열 리터럴로 변환하도록합니다. 정밀도보다 호환성에 더 관심이 있다면 datetime을 사용하십시오.
FistOfFury

4
또 다른 옵션은 호환성을 위해 날짜 시간으로 변환 된 열이있는 인덱스 된 뷰를 사용하는 것입니다. 그러나 앱을 뷰를 가리킬 수 있어야합니다.
TamusJRoyce

9
DATETIMEOFFSET을 사용한 시간대 지원은 잘못된 이름입니다. 시간대가 아닌 특정 순간의 UTC 오프셋 만 저장합니다.
Suncat2000 2016 년

6
@Porad : "SQL 표준"으로 인해 ""휴대용 "이라는 이점이있는 실제 이점은 무엇입니까?"포트 "에 대한 읽기 / 유지 관리가 훨씬 적은 코드를 다른 RDBMS에 훨씬 더 많이 작성하는 것 외에 아마도 Microsoft에서 제공 한 SQL Server 도구 및 드라이버 (있는 경우) 외에 실제로 DateTime2Type 의 특정 비트 수준 표현 (또는 다른 SQL Server)에 의존하는 앱이 있습니까? 내가 묻는 이유는 아래 7/10/17 답변의 단점을 참조하십시오
Tom

2
@Adam Porad : 또한 이러한 모든 혜택은 (엔지니어링 또는 과학 응용 프로그램 이외의) 불필요 할 가능성이 높으므로 혜택을 잃을 가치가 거의 없을 것입니다. 덧셈, 뺄셈, 최소값, 최대 값 및 평균에 대한 부동 소수점 숫자 (적용된 경우 일 수, 최소 날짜-시간 이후의 분수 일 수 포함) 값. 자세한 내용은 아래 내 7/10/17 답변의 단점을 참조하십시오.
Tom

493

DATETIME2날짜 범위는 " DATETIME0001/01/01 "에서 " 9999/12/31 "이며 유형은 1753-9999 년만 지원합니다.

또한 필요한 경우 DATETIME2시간 측면에서 더 정확할 수 있습니다. DATETIME은 3 1/3 밀리 초로 제한되는 반면 DATETIME2100ns까지 정확하게 측정 할 수 있습니다.

두 유형 모두 System.DateTime.NET에 매핑됩니다 . 차이는 없습니다.

선택의 여지가 있다면 DATETIME2가능할 때마다 사용하는 것이 좋습니다 . 나는 DATETIME(후진 호환성을 제외하고) 사용 하면 어떤 이점도 얻지 못합니다 -날짜가 범위를 벗어난 번거 로움으로 어려움이 덜합니다.

플러스 : 날짜 만 필요하면 (시간 부분이없는 경우) DATE를 사용하십시오-날짜 DATETIME2와 공간이 절약됩니다! :-) 같은 시간에만 사용 TIME합니다. 이것이 바로 이러한 유형입니다.


158
.NET DateTime 값을 SqlCommand에 매개 변수로 추가 할 때는주의하십시오. 이는 이전 날짜 시간 유형 인 것으로 가정하기 때문에 1753-9999 연도 범위를 벗어난 DateTime 값을 쓰려고하면 오류가 발생합니다. SqlParameter에 대해 형식을 System.Data.SqlDbType.DateTime2로 명시 적으로 지정하지 않으면 어쨌든 datetime2는 .NET DateTime 유형에 저장할 수있는 모든 값을 저장할 수 있기 때문에 훌륭합니다.
Triynko

10
@marc_s-그게 널이 아닌가?
JohnFx

8
@JohnFX-약간 늦었지만 날짜 시간을 null로 설정하지 않았습니다. Nullable <datetime> 또는 datetime을 사용 하시겠습니까? 어느 것이 null을 잘 처리하는지-proc에 매핑 할 때 단순히 param.value = someDateTime ?? DBValue.Null 그것의 불행한 일이 후 우리는 숫자와 데이터 유형 붙어있어 - 너무 '일반적인'보인다)
MSFT - 아담 Tuliper

69
롤, 나는 방금 내 자신의 의견임을 깨닫기 전에 (위) 내 자신의 의견을 찬성하려고 노력했다. 더 정확한 SqlDbType.DateTime2로 명시 적으로 설정하지 않으면 SqlParameters로 전달 될 때 기본적으로 모든 DateTime 값을 TRUNCATE하려는 .NET 프레임 워크의 바보 같은 디자인 결정을 처리하고 있습니다. 올바른 유형을 자동으로 유추하는 데 많은 도움이됩니다. 실제로, 그들은 변경을 투명하게하여 덜 정확하고 덜 효율적이며 제한된 범위의 구현을 대체하고 원래의 "datetime"유형 이름을 유지해야했습니다. 참조 stackoverflow.com/q/8421332/88409
Triynko

5
@marc_s 그게 무엇 Nullable<DateTime>입니까?
ChrisW

207

datetime2 는 (이전 앱 호환성)을 제외한 대부분의 측면에서 승리합니다.

  1. 더 큰 범위의 값
  2. 더 나은 정확도
  3. 더 작은 저장 공간 (선택적인 사용자 지정 정밀도가 지정된 경우)

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

다음 사항에 유의하십시오

  • 통사론
    • datetime2 [(분수 초 정밀도 => 저장 크기 아래를보십시오)]
  • 정밀, 스케일
    • 100ns의 정확도로 0 ~ 7 자리 숫자.
    • 기본 정밀도는 7 자리입니다.
  • 보관 크기
    • 정밀도 3 미만의 6 바이트;
    • 정밀도 3 및 4의 경우 7 바이트
    • 다른 모든 정밀도 에는 8 바이트가 필요합니다 .
  • DateTime2 (3)DateTime 과 동일한 자릿수를 갖지만 8 바이트 대신 7 바이트의 저장 영역을 사용합니다 ( SQLHINTS- DateTime Vs DateTime2 )
  • datetime2에서 자세한 내용 찾기 (Transact-SQL MSDN 기사)

이미지 출처 : MCTS 자체 학습 교육 키트 (시험 70-432) : Microsoft® SQL Server® 2008-구현 및 유지 관리 3 장 : 표-> 1과 : 표 만들기-> 66 페이지


7
+1 통계를 보여 주셔서 감사합니다. datetime2(우승자)
Pankaj Parkar

2
@Iman Abidi : 참조한 "SQLHINTS- DateTime Vs DateTime2"기사에서 2014 년 9 월 10 일 오후 3:51의 Oskar Berggren의 의견에 따르면 : "datetime2 (3)은 datetime과 동일하지 않습니다. 동일한 숫자를 갖습니다. 날짜 시간의 정밀도는 3.33ms이고 datetime2 (3)의 정밀도는 1ms입니다. "
Tom

1
@PankajParkar : Woah, 그렇게 빠르지 않습니다. 아래 답변 7/10/17의 답변의 단점 섹션을 살펴볼 수 있습니다.
Tom

datetime2저장 공간을 적게 사용 datetime하면서도 더 넓은 범위와 높은 정밀도를 제공하는 방법은 무엇입니까?
Dai

107

@marc_s 및 @Adam_Poward와 동의합니다 .DateTime2가 선호되는 방법입니다. 날짜 범위가 넓고 정밀도가 높으며 저장 공간이 같거나 적습니다 (정밀도에 따라 다름).

그러나 토론이 놓친 한 가지는 ...
@Marc_s states : Both types map to System.DateTime in .NET - no difference there. 그러나 이것은 정확 하지 않습니다. 그 반대는 아닙니다. 날짜 범위 검색을 수행 할 때 중요합니다 (예 : "2010/5/5에서 수정 된 모든 레코드 찾기").

.NET의 버전은 Datetime범위와 정밀도가 비슷합니다 DateTime2. 닷넷을 매핑 할 때 Datetime기존의 SQL까지 암시 반올림가 발생합니다 . 이전 SQL 은 3 밀리 초까지 정확합니다. 이것은 당신이 하루의 끝까지 갈 수있는 한 가깝다는 것을 의미합니다 . 더 높은 것은 다음 날로 올림됩니다.DateTimeDateTime11: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'

이 암시 적 반올림을 피하는 것이 DateTime2로 이동해야하는 중요한 이유입니다. 날짜의 암시 적 반올림은 분명히 혼란을 야기합니다


14
어쨌든 하루의 "끝"을 찾으려고하지 않아도이 반올림을 피할 수 있습니다. > = 5 월 5 일 및 <5 월 6 일은 훨씬 안전하며 모든 날짜 / 시간 유형 (물론 TIME 제외)에서 작동합니다. 또한 m / d / yyyy와 같이 지역적으로 모호한 형식을 피하는 것이 좋습니다.
Aaron Bertrand

2
@AaronBertrand-전적으로 동의하지만 설명 할 가치가있는 문제의 수를 살펴 봅니다.
EBarr

1
에서 20100505로 전환 한 이유는 무엇 5/5/2010입니까? 전자의 형식은 SQL Server의 모든 지역에서 작동합니다. 후자는 끊어 질 것입니다 : SET LANGUAGE French; SELECT Convert(datetime, '1/7/2015')죄송합니다 :2015-07-01 00:00:00.000
ErikE

1
@EBarr : Re. "DateTime2는 앞으로 선호되는 방법입니다. 날짜 범위가 넓고 정밀도가 높으며 저장 용량이 같거나 적습니다 (정밀도에 따라 다름) : 동의하지 않습니다. 아래 답변은 7/10/17에있는 답변의 단점 섹션을 참조하십시오. 요컨대, 이러한 이점은 (엔지니어링 / 과학 응용 프로그램 외부) 필요하지 않을 가능성이 높기 때문에 MUCH가 필요할 가능성이 높지 않기 때문에 암묵적으로 / 명시 적으로 부동 소수점 숫자 ( +,-및 평균에 대해 적용되는 경우 일 수 (최소 날짜-시간 이후의 분수) 값)
Tom

20

거의 모든 답변과 의견은 찬성에 대해 무겁고 단점을 밝혔습니다. 지금까지 모든 장단점에 대한 요약과 함께 한 번만 언급하거나 전혀 언급하지 않은 몇 가지 중요한 단점 (아래 2 번)이 있습니다.

  1. 장점 :

1.1. 더 많은 ISO 호환 (ISO 8601) (실제로 이것이 어떻게 작동하는지 모르겠지만).

1.2. 더 많은 범위 (1/1/0001 ~ 12/31/9999 vs 1 / 1 / 1753-12 / 31 / 9999) (1753 이전의 모든 추가 범위는 예를 들어, 역사, 천문학, 지질학 등의 앱에서).

1.3. .NET의 DateTimeType 범위와 정확히 일치합니다 (아래의 Con # 2.1을 제외하고 값이 대상 유형의 범위와 정밀도 내에 있으면 오류 / 반올림이 발생하는 경우 특별한 코딩없이 변환 할 수 있지만).

1.4. 더 정밀함 (100 나노초, 즉 0.000,000,1 초 대 3.33 밀리 초, 0.003,33 초) (예 : 공학 / 과학 응용 프로그램을 제외하고는 추가 정밀도가 사용되지 않을 수 있음).

1.5. Iman Abidi가 주장한 것처럼 (1 millisec에서와 같지 않고 (3.33 millisec에서와 같이) 비슷한 것으로 구성하면 DateTime더 적은 공간 (7 대 8 바이트)을 사용하지만 물론, 당신은 정밀 이익은 아마 (필요하지 않은 이익이지만 가장 많이 선전 된 두 가지 범위 중 하나 일 것입니다).

  1. 단점 :

2.1. 매개 변수를 .NET SqlCommandSystem.Data.SqlDbType.DateTime2전달할 DateTime때는 기본값이이므로 SQL Server 의 범위 및 / 또는 정밀도를 벗어난 값을 전달할 수 있는지 여부를 지정해야합니다 System.Data.SqlDbType.DateTime.

2.2. 숫자 값과 연산자를 사용하여 SQL Server 표현식에서 다음을 수행하기 위해 암시 적 / 쉽게 부동 소수점 숫자 (최소 날짜-시간 이후의 일 수) 값으로 변환 할 수 없습니다.

2.2.1. 일 또는 부분 일을 더하거나 뺍니다. 참고 : DateAdd날짜-시간의 일부가 아닌 여러 항목을 고려해야 할 때는 기능을 해결 방법으로 사용 하는 것이 쉽지 않습니다.

2.2.2. "연령"계산을 위해 두 날짜-시간의 차이를 고려하십시오. 참고 : 대부분의 사람들이 예상 한대로 DateDiff계산하지 않기 때문에 SQL Server의 함수를 대신 사용할 수는 없습니다 age. 두 날짜 시간이 작은 경우에도 지정된 단위의 달력 / 시계 날짜-시간 경계를 넘을 경우 그 단위, 예를 들어 0 대 그 장치의 하나로서 차이를 리턴 거 상기 DateDiff에서는 Day'만 1 밀리 초 간격 해당 날짜 시간 인 경우 1 대 0 (일)을 반환 두 날짜 시간 S의 다른 날짜에 (예 : "1999-12-31 23 : 59 : 59.9999999"및 "2000-01-01 00 : 00 : 00.0000000"). 달력 날짜를 넘지 않도록 이동 한 경우 동일한 1 밀리 초 차이 날짜-시간 Day은 0 (일)의 "DateDiff"를 반환합니다 .

2.2.3. 테이크 Avg단순히 다시 제 다음 "플로트"로 변환하여 (집계 쿼리에서) 날짜 시간을 DateTime.

참고 : DateTime2숫자 로 변환하려면 값이 1970 년보다 작지 않다고 가정하는 다음 수식과 같은 작업을 수행해야합니다 (즉, 추가 범위와 추가 217 년을 모두 잃고 있음을 의미 함). 숫자 오버플로 문제가 발생할 수 있으므로 추가 범위를 허용하도록 수식을 간단히 조정할 수 없습니다.

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

물론, 당신은 또한 수 CastDateTime첫번째 (필요한 다시 다시하는 경우 DateTime2),하지만 당신은 정밀도와 범위 (이전의 모든 년 1753) 혜택을 잃게 DateTime2DateTimeprolly 2의 가장 큰 또한 동시에 prolly 있습니다 덧셈 / 뺄셈 / "나이"(vs. DateDiff) / Avgcalcs 이익을 위해 암시 적 / 쉬운 부동 소수점 숫자 (일 수) 로의 변환을 잃을 때 왜 그것을 사용 하는가? 내 경험에.

Btw, Avg날짜 시간은 중요한 유스 케이스입니다 ( 적어도 있어야 합니다). a) 날짜-시간 (공통 기본 날짜-시간 이후)을 사용하여 지속 시간을 나타내는 데 사용되는 평균 지속 시간을 얻는 데 사용 (공통 관행), b) 평균 날짜- time은 행 범위 / 그룹의 날짜-시간 열에 있습니다. c) 컬럼에서 유효하지 않거나 더 이상 유효하지 않거나 더 이상 사용되지 않아야하는 값을 모니터 / 문제 해결하기위한 표준 임시 쿼리 (또는 최소한 표준 이어야 함) 및 (사용 가능한 경우) Min, AvgMax일시 타임 스탬프는 그 값과 관련된.


1
반대되는 견해와 마찬가지로 방정식의 c # 쪽을 지적합니다. 다른 모든 "프로"와 결합하여 사람들이 고통을 겪고 싶은 곳을 기반으로 좋은 선택을 할 수 있습니다.
EBarr

1
@EBarr : 내 " '상대적 관점" "의 단점 # 1 부분 만이"방정식의 c # 쪽을 나타냅니다 ". 내가 말했듯이 나머지 부분 (Cons # 2.2.1-2.2.3) DateTime은 SQL Server 쿼리 및 문에 대한 영향과 관련이 있습니다.
Tom

Re 2.2.1-날짜를 산술하는 것은 안전하지 않은 관행으로 간주되며 선호하는 방법은 항상 DateAdd 및 관련 함수를 사용하는 것입니다. 이것이 가장 좋은 방법입니다. 날짜 산술을 수행하는 데 심각한 책임이 있습니다. 최소한 날짜 유형에서는 작동하지 않습니다. 몇 가지 기사 : sqlservercentral.com/blogs/… sqlblog.org/2011/09/20/…
RBerman

@RBerman : Re. "안전하지 않은": DateTime2이미 언급 한 (오버플로 가능성이 높기 때문에) 특정 날짜 유형에서는 안전하지 않습니다. 레. "대부분의 날짜 유형에서는 작동하지 않습니다.": 하나만 사용하면되고 대부분의 앱에서 대부분의 날짜는 전체 수명 시간 동안 다른 날짜 유형으로 변환 할 필요가 없습니다. , DateTime2하는 DateTime그 모든 여분 만 프로그램뿐만 아니라 임시 연구 쿼리가 아닌 산술 친화적 인 날짜 형식을 사용하지 코딩 가치가 없어, 점을 감안 (P 예를 들면 "날짜 산술"해야 할 일)..

15

DateTime2는 해당 필드에 Now ()를 쓰려고하는 Access 개발자 인 경우 혼란을 초래합니다. Access-> SQL 2008 R2 마이그레이션을 수행하고 모든 datetime 필드를 DateTime2로 입력했습니다. 값이 폭격됨에 따라 Now ()를 사용하여 레코드를 추가합니다. 2012 년 1 월 1 일 오후 2:53:04에는 문제가 없었지만 2012 년 1 월 10 일 오후 2:53:04에는 문제가 없었습니다.

일단 캐릭터가 차이를 만들었습니다. 누군가에게 도움이되기를 바랍니다.


15

다음은 smalldatetime, 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 바이트를 절약 할 수 있습니다.


10

가 증가하면서 정밀도를 함께 DATETIME2 , 일부 클라이언트는 지원하지 않습니다 날짜 , 시간 , 또는 DATETIME2를 하고 문자열 리터럴로 변환하도록 강요. 특히 Microsoft는 이러한 데이터 형식과 관련된 "하위 수준"ODBC, OLE DB, JDBC 및 SqlClient 문제에 대해 언급하고 각 형식을 매핑 할 수있는 방법을 보여주는 차트 를 제공합니다.

정밀도보다 값 호환성 이 있으면 datetime을 사용하십시오.


10

오래된 질문 ... 그러나 여기에 누군가가 아직 언급하지 않은 것을 추가하고 싶습니다 ... (참고 : 이것은 내 자신의 관찰이므로 참조를 요구하지 마십시오)

필터 기준에 사용하면 Datetime2가 더 빠릅니다.

TLDR :

SQL 2016에서는 최대 시간까지 정확한 시간을 저장해야했기 때문에 10 만 개의 행과 날짜 시간 열 ENTRY_TIME이있는 테이블이있었습니다. 많은 조인과 하위 쿼리로 복잡한 쿼리를 실행하는 동안 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 열을 datetime2로 변경하는 것입니다.

이제 이전에 시간 초과 된 동일한 쿼리가 1 초도 걸리지 않습니다.

건배


9

미국 이외의 설정을 사용하는 경우 날짜 문자열을 해석 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 월 6 일) datetime및에 대해 2013-06-05(예 : 6 월 5 일)을 반환 합니다 datetime2. 그러나,와 dateformat로 설정 mdy, 모두 @d@d2반환 2013-06-05.

datetime동작은과 상충 보인다 MSDN 설명서SET DATEFORMAT: 어떤 상태 예를 들어 ISO 8601을위한 독립적 DATEFORMAT 설정의 해석, 일부 문자열 형식 . 분명히 사실이 아닙니다!

이것에 물릴 때까지, 나는 yyyy-mm-dd언어 / 로케일 설정에 관계없이 항상 날짜가 올바르게 처리 될 것이라고 생각 했습니다.


2
아니. ISO 8601의 경우 YYYYMMDD (대시 없음)를 의미한다고 생각합니다. SET LANGUAGE FRENCH; DECLARE @d DATETIME = '20130605'; SELECT @d;대시로 다시 시도하십시오.
Aaron Bertrand

1
표준은 달력 날짜 표현을 위해 YYYY-MM-DD 및 YYYYMMDD 형식을 모두 허용합니다. MSDN은 ISO 8601 사양의 어떤 부분 집합이 독립적으로 해석되는지에 대해 더 구체적이어야한다고 생각합니다!
Richard Fawcett

1
나는 알고 있지만 SQL Server에서는 대시가없는 구문 만 안전합니다.
Aaron Bertrand

6

이 기사 에 따르면 DateTime2를 사용하여 DateTime의 정밀도를 동일하게 유지하려면 DateTime2 (3)을 사용하면됩니다. 이는 동일한 정밀도를 제공하고 1 바이트를 덜 차지하며 확장 된 범위를 제공해야합니다.


분명히 말하면 .NET DateTime이 아니라 SQL datetime과 동일한 정밀도입니다.
Sam Rueby

맞습니다. 저는 모든 사람들이 문맥을 이해하지만 그 가치를 구체적으로 언급 할 것이라고 생각했습니다.
jKlaus

4

방금 하나의 이점을 우연히 발견 DATETIME2했습니다. 파이썬 adodbapi모듈 의 버그를 피합니다. 파이썬 모듈의 표준 라이브러리 datetime값이 전달 DATETIME되면 열이 0이 아닌 마이크로 초를 갖지만 열이로 정의되면 제대로 작동합니다 DATETIME2.


0
Select ValidUntil + 1
from Documents

위의 SQL은 DateTime2 필드에서 작동하지 않습니다. "오퍼랜드 타입 충돌 : datetime2는 int와 호환되지 않습니다."

다음 날에 1을 더하면 개발자가 몇 년 동안 데이트를해온 것입니다. 이제 Microsoft는이 간단한 기능을 처리 할 수없는 완전히 새로운 datetime2 필드를 갖습니다.

"이전 유형보다 더 새로운 유형을 사용합시다"라고 생각하지 않습니다!


2
방금 여기 분명히 우리가 지금 datetimedatetime2데이터 유형이 모두 SQL Server 2008의 도입 또한 얻을 Operand type clash: date is incompatible with int으로부터 date하루 도트 이후 주변왔다 유형입니다. 세 가지 데이터 유형은 모두 잘 작동 dateadd(dd, 1, ...)합니다.
AlwaysLearning

2
이것은 명확하지 않습니다. 날짜 시간 필드가있는 SQLServer 2005 데이터베이스가 있습니다.
Paul McCarthy

0

DATETIME2을 저장하는 것이 더 좋은 방법 이라고 생각 date합니다 DATETIME. 에서 SQL Server 2008사용할 수 DATETIME2있으며 날짜와 시간 bytes을 저장하고 저장하는 데 6-8 이 걸리며 정밀도는 100 nanoseconds입니다. 더 큰 시간 정밀도가 필요한 사람이라면 누구나 원할 것 DATETIME2입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.