복붙노트

[SQL] SQL 서버에서 날짜 시간 대 DATETIME2

SQL

SQL 서버에서 날짜 시간 대 DATETIME2

어느 것:

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

나는 정밀 (저장 공간 아마)의 차이를 알고 있어요,하지만 지금은 그 무시, 무엇을 사용하는, 또는 어쩌면 우리가 DATETIME2 만 사용해야하는 경우에 가장 좋은 방법은 문서가?

해결법

  1. ==============================

    1.날짜에 대한 MSDN 설명서 DATETIME2를 사용하는 것이 좋습니다. 여기에 자신의 추천 :

    날짜에 대한 MSDN 설명서 DATETIME2를 사용하는 것이 좋습니다. 여기에 자신의 추천 :

    datetime2에 큰 날짜 범위, 더 큰 기본 소수점 정밀도 및 선택적 사용자 지정 정밀도를 가지고있다. 또한 사용자가 지정한 정밀도에 따라 덜 스토리지를 이용할 수있다.

  2. ==============================

    2.DATETIME2는 DATETIME 타입만을 지원 1753-9999 년 동안 "12분의 9,999 / 31"으로 "0001 / 01 / 01"의 기간을 갖는다.

    DATETIME2는 DATETIME 타입만을 지원 1753-9999 년 동안 "12분의 9,999 / 31"으로 "0001 / 01 / 01"의 기간을 갖는다.

    당신이 필요로하는 경우 또한, DATETIME2 시간의 측면에서 더 정확하게 할 수있다; DATETIME2는 100ns의 정확한 다운 수 있지만 DATETIME은 1/3 3 밀리 초로 제한된다.

    두 유형 모두 .NET에서 System.DateTime에 매핑 - 아니 차이가.

    당신은 선택의 여지가 있다면, 가능하면 DATETIME2를 사용하는 것이 좋습니다 것입니다. 나는 (이전 버전과의 호환성을 위해 제외) DATETIME을 사용하는 혜택을 볼 수 없습니다 - 당신은 (날짜가 같은 범위와 번거 로움 밖으로 인 상태) 더 적은 문제가 있습니다.

    플러스 : 당신은, 사용 날짜 (시간 부분없이) 날짜를 필요로하는 경우 - 너무, 단지 DATETIME2 좋은으로 그리고 당신에게 공간을 절약! 사용 시간 - :-) 같은 단지 시간에 간다. 즉 이러한 유형의 거기에 무엇이다!

  3. ==============================

    3.DATETIME2는 (구 응용 프로그램 호환성)을 제외하고 대부분의 측면에 승리

    DATETIME2는 (구 응용 프로그램 호환성)을 제외하고 대부분의 측면에 승리

    다음 사항을 유의하시기 바랍니다

    이미지 출처 : MCTS Self-Paced 교육 키트 (시험 70-432) : 마이크로 소프트 SQL Server® 2008 - 구현 및 유지 관리 제 3 장 : 테이블 -> 1 장 : 표 만들기 -> 66 페이지

  4. ==============================

    4.나는 @marc_s와 concurr 및 @Adam_Poward - DATETIME2 전진 선호하는 방법입니다. 이것은 넓은 범위의 기간, 높은 정밀도를 가지고 있으며, 용도는 작거나 보관 (정밀도에 따라).

    나는 @marc_s와 concurr 및 @Adam_Poward - DATETIME2 전진 선호하는 방법입니다. 이것은 넓은 범위의 기간, 높은 정밀도를 가지고 있으며, 용도는 작거나 보관 (정밀도에 따라).

    한 가지 토론 그러나, 놓친 ... 상태 @Marc_s : 두 가지 유형의 .NET에서 System.DateTime에 매핑 - 아니 차이가. 그러나 이것은 역은 사실 정확하지 않다 ... 날짜 범위 검색을 수행 할 때 (예를 들어 "모든 기록이 2010년 5월 5일에서 수정 날 찾아") 문제.

    날짜 시간의 .NET 버전은 DATETIME2 유사 범위와 정밀도를 가지고있다. 때 매핑 닷넷 날짜 시간 암시 적 라운딩가 발생 된 SQL 날짜 시간에 이르기까지. 이전 SQL 날짜 시간은 3 밀리 초 정확합니다. 이 수단 (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'
    

    이 암시 적 라운딩을 피하기 DATETIME2로 이동하는 중요한 이유입니다. 날짜의 암시 적 라운딩 명확하게 혼란을 야기 :

  5. ==============================

    5.거의 모든 답변과 의견은 단점에 프로에 무거운 빛이었다. 여기 (아래 # 2) 모든 장점 지금까지 단점 플러스 몇 가지 중요한 단점의 요점을 되풀이 내가 한 번만 여부를 전혀 언급 본 것입니다.

    거의 모든 답변과 의견은 단점에 프로에 무거운 빛이었다. 여기 (아래 # 2) 모든 장점 지금까지 단점 플러스 몇 가지 중요한 단점의 요점을 되풀이 내가 한 번만 여부를 전혀 언급 본 것입니다.

    1.1. 더 ISO의 규격 (ISO 8601) (이 실제로 플레이에 와서 어떻게 모르겠지만).

    1.2. 더 많은 범위 (1/1/0001 대 12/31/9999 1 / 1 / 1천7백53에서 12 사이 / 31분의 9,999) (여분의 범위 있지만, 올해 1753 이전에 모든 가능성 예를 제외하고 사용되지 않습니다., 과거, 천문학, 지질에 등 앱).

    1.3. 정확히 .NET의 날짜 시간 유형의 범위의 범위를 일치 (비록 값이 발생합니다 반올림 / 다른 오류 아래 콘 # 2.1 제외 대상 유형의 범위와 정밀도 내에있는 경우 코딩 특별한으로 변환 앞뒤로 모두).

    1.4. 더 정밀 (100 나노초 초 0.000,000,1 일명. 대 3.33 밀리 초 일명 0.003,33 초.) (여분의 정밀도 가능성이 전을 제외하고 사용하지 않을지라도., 공학 / 과학 응용 프로그램에서).

    1.5. (7 대 8 바이트) (1 millisec "동일한"하지 같이 (같은 3.33 millisec에서) 이만 Abidi는 주장했다으로) 날짜 시간 등의 정밀도, 적은 공간을 사용하는 유사 용으로 구성,하지만 물론, 당신은 잃는 것 때 가장 가능성이 불필요한 장점 불구하고 선전 두 (다른 존재의 범위)의 가능성 일) 인 정밀 혜택을 누릴 수 있습니다.

    2.1. 닷넷하는 SqlCommand에 매개 변수를 전달할 때 당신은 SQL 서버 날짜 시간의 범위 및 / 또는 정밀 이외의 값을 전달 할 수있다, 당신은, System.Data.SqlDbType.DateTime에 그것 때문에 기본값을 System.Data.SqlDbType.DateTime2를 지정해야합니다.

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

    2.2.1. 추가하거나 일 부분 일 #을 뺍니다. 참고 :이 경우 여러 고려해야 할 필요가있을 때 해결 사소한 아니므로 DateAdd 함수 기능을 사용하지 않는 날짜 - 시간의 모든 부분.

    2.2.2. "연령"계산을 위해 두 날짜 배의 차이를 가져 가라. 주 : 대부분의 사람들이 기대하는 것처럼하지 컴퓨팅 시대를 않기 때문에 당신은 단순히 대신 SQL 서버의 참조 DateDiff 기능을 사용할 수없는 두 날짜와 시간은 심지어위한 경우 지정된 단위의 달력 / 시계 날짜 - 시간의 경계를 건너 발생하는 경우 그 단위의 작은 부분은, 예를 들어 0 대 그 단위의 1과의 차이를 반환 할 것, 일의 두 날짜 시간 간격 단 1 밀리 초의에서 참조 DateDiff 그 날짜 - 경우 1 대 0 (일)을 반환합니다 ( "59 : 59.9999999 1999년 12월 31일 23"및 "00.0000000 2000-01-01 00 : 00"즉,) 시간은 다른 일에있다. 그들은 달력 일 교차하지 않도록 이동 한 경우 같은 1 개 밀리 초 차이 날짜 - 시간, 일의 0 (일)의에서 "참조 DateDiff"를 반환합니다.

    2.2.3. 단순히 날짜 시간에 다시 제 다음 "플로트"로 변환하여 (집계 쿼리에서) 날짜 - 시간의 평균을.

    참고 : 숫자로 DATETIME2를 변환하려면, 당신은 여전히 ​​당신의 가치는 적지 가정 다음 수식처럼 뭔가를해야 당신이 여분의 범위를 모두 더한 또 다른 2백17년을 잃고있어주의를 의미하는 1970 년 (이상 :. 당신을 단순히 숫자 오버 플로우 문제로 실행 할 수 있기 때문에 여분의 범위를 허용하는 공식을 조정하지 못할 수 있습니다.

    25,567 + (DATEDIFF (SECOND {D '1970-01-01'} @Time) + DATEPART (나노초, @Time) / 1.0E + 9) / 86400.0 - 소스 "https://siderite.dev/blog "/how-to-translate-t-sql-datetime2-to.html

    물론, 당신은 또한 첫번째 날짜 시간에 주조 수 (다시 DATETIME2에 필요한 다시는 경우),하지만 당신은 prolly 2 가장 크고 또한 정밀도와 범위 날짜 시간 대 DATETIME2의 (이전의 모든 년 1753) 혜택을 잃을 것 동시에 prolly 2 가장 가능성이 필요한 질문이 / 뺄셈 / "나이"(대 참조 DateDiff) / 평균 추가 할 (일 수) 부동 소수점 숫자로 암시 적 / 쉽게 변환을 잃을 때 왜 그것을 사용을 구걸하는 내 경험에 큰 하나입니다 CALCS의 혜택을 누릴 수 있습니다.

    BTW, 일 - 시간의 평균은 중요한 유스 케이스 (또는 적어도되어야합니다). a)는 공통 기본 날짜 - 시간 이후 날짜와 시간 () 시간 (일반적인 방법), (B)를 나타내는 데 사용되는 평균 기간을 얻기에 사용 외에)는 무엇 평균 날짜 -에 대시 보드 형태의 통계를 얻을 또한 유용 시간의 행의 범위 / 그룹 일시 열이다. c) 상기 표준 (또는 적어도 표준으로한다) 임시 쿼리 열에 모니터 / 문제 해결 값에 / 더 이상 영원히 유효하지 않을 수 있습니다 / 또는 사용 중지해야 할 수도 있습니다 각 값 발생 횟수에 대한 목록입니다 및 (가능한 경우) 최소, 평균 및 최대 일시 타임 스탬프는 그 값과 관련된.

  6. ==============================

    6.당신이 액세스 개발자가 해당 필드에 () 이제 쓰기를 시도하는 경우 DATETIME2은 파괴를 낸다. > SQL 2008 R2 마이그레이션 및 그것은 DATETIME2로 모든 날짜 필드를 넣어 - 그냥 액세스를했다. 값이 폭격으로 () 이제와 기록을 추가. 그것은 2012 년 1 월 오후 2시 53분 4초에 괜찮다고하지만,하지에 2012년 1월 10일 오후 2시 53분 4초.

    당신이 액세스 개발자가 해당 필드에 () 이제 쓰기를 시도하는 경우 DATETIME2은 파괴를 낸다. > SQL 2008 R2 마이그레이션 및 그것은 DATETIME2로 모든 날짜 필드를 넣어 - 그냥 액세스를했다. 값이 폭격으로 () 이제와 기록을 추가. 그것은 2012 년 1 월 오후 2시 53분 4초에 괜찮다고하지만,하지에 2012년 1월 10일 오후 2시 53분 4초.

    문자되면 차이를했다. 그것은 누군가가 도움이되기를 바랍니다.

  7. ==============================

    7.여기에 당신에게 저장소 크기의 차이 (바이트) 및 정밀 smalldatetime으로 사이, 날짜, DATETIME2 (0) DATETIME2 (7)를 보여줍니다 예입니다 :

    여기에 당신에게 저장소 크기의 차이 (바이트) 및 정밀 smalldatetime으로 사이, 날짜, 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
    

    그래서 두 번째까지의 정보를 저장하려는 경우 -하지만 밀리 초 단위 - 내가 대신 날짜 또는 DATETIME2 (7)의 DATETIME2 (0)를 사용하는 경우 I 2를 각각 바이트를 저장할 수 있습니다.

  8. ==============================

    8.DATETIME2와 정밀도가 증가하면서, 일부 고객은 날짜, 시간, 또는 DATETIME2을 지원하고 문자열 리터럴로 변환하도록 강요하지 않습니다. 특히 마이크로 소프트는 이러한 데이터 유형 "수준 아래"ODBC, OLE DB, JDBC 및하는 SqlClient 문제를 언급하고 각 유형을 매핑 할 수 있습니다 방법을 보여주는 차트가 있습니다.

    DATETIME2와 정밀도가 증가하면서, 일부 고객은 날짜, 시간, 또는 DATETIME2을 지원하고 문자열 리터럴로 변환하도록 강요하지 않습니다. 특히 마이크로 소프트는 이러한 데이터 유형 "수준 아래"ODBC, OLE DB, JDBC 및하는 SqlClient 문제를 언급하고 각 유형을 매핑 할 수 있습니다 방법을 보여주는 차트가 있습니다.

    정밀 이상 값 호환성, 사용 날짜하면

  9. ==============================

    9.오래된 질문 ...하지만 난 이미 여기에 누군가에 의해 명시되지 않은 무언가를 추가 할 ... (참고 :이 때문에 어떤 기준을 요구하지 않는, 내 자신의 관찰이다)

    오래된 질문 ...하지만 난 이미 여기에 누군가에 의해 명시되지 않은 무언가를 추가 할 ... (참고 :이 때문에 어떤 기준을 요구하지 않는, 내 자신의 관찰이다)

    필터 기준에서 사용하는 경우 DATETIME2가 빠릅니다.

    TLDR :

    이 초에 정확한 시간을 저장하는 데 필요한 때문에 SQL 2016에서 나는 십만 행과 날짜 시간 열 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 초 걸렸습니다, 어디 절없이 0.01 초를했다.

    나는 날짜 필터링 성능으로이 문제를 여기 많은 스레드를 건너 왔어요

    나는 조금 쿼리 최적화. 하지만 내가 가진 실제 속도는 DATETIME2에 날짜 열을 변경했다.

    이제 시간이 초과 동일한 쿼리는 이전에 초 미만이 소요됩니다.

    건배

  10. ==============================

    10.미국 이외의 DATEFORMAT 설정을 사용하는 경우 날짜로 날짜 문자열의 해석 및 DATETIME2는 너무 다를 수 있습니다. 예를 들면

    미국 이외의 DATEFORMAT 설정을 사용하는 경우 날짜로 날짜 문자열의 해석 및 DATETIME2는 너무 다를 수 있습니다. 예를 들면

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

    이 반환 2013년 5월 6일 (즉 5월 6일) 날짜에 대한, 그리고 2013년 6월 5일 (즉 6월 5일)에 대한 DATETIME2. 그러나, MDY에 DATEFORMAT 설정, 모두 @d과와 @ D2 반환 2013년 6월 5일.

    예를 들어 ISO 8601을위한 독립적 DATEFORMAT 설정의 해석, 일부 문자열 형식 : 날짜 시간 동작 상태 SET DATEFORMAT의 MSDN 문서와 확률에 보인다. 분명 사실이 아니다!

    나는이 물린 때까지, 나는 항상 YYYY-MM-DD 날짜 단지에 관계없이 언어 / 로케일 설정, 바로 처리 될 것이라고 생각 것입니다.

  11. ==============================

    11.당신이 DATETIME2를 사용하여 날짜 시간의 동일한 정밀도를하고 싶은 경우이 문서에 따르면, 당신은 단순히 DATETIME2 (3)를 사용합니다. 이것은 당신에게 동일한 정밀도를 제공 한 적은 바이트를지고 확장 된 범위를 제공해야한다.

    당신이 DATETIME2를 사용하여 날짜 시간의 동일한 정밀도를하고 싶은 경우이 문서에 따르면, 당신은 단순히 DATETIME2 (3)를 사용합니다. 이것은 당신에게 동일한 정밀도를 제공 한 적은 바이트를지고 확장 된 범위를 제공해야한다.

  12. ==============================

    12.난 그냥 DATETIME2에 대한 또 하나의 장점을 우연히 발견 : 그것은 DATETIME 컬럼 0이 아닌 마이크로을 가지고 있지만 열은 다음과 같이 정의 된 경우 벌금을 작동 날짜 값이 전달되는 표준 라이브러리 경우 불면 파이썬 adodbapi 모듈에서 버그를 방지 DATETIME2.

    난 그냥 DATETIME2에 대한 또 하나의 장점을 우연히 발견 : 그것은 DATETIME 컬럼 0이 아닌 마이크로을 가지고 있지만 열은 다음과 같이 정의 된 경우 벌금을 작동 날짜 값이 전달되는 표준 라이브러리 경우 불면 파이썬 adodbapi 모듈에서 버그를 방지 DATETIME2.

  13. ==============================

    13.

    Select ValidUntil + 1
    from Documents
    

    SQL 위는 DATETIME2 필드 작동하지 않습니다. 그것은 반환하고 오류 "피연산자 유형 충돌 : DATETIME2는 INT와 호환되지 않습니다"

    하나를 추가하면 다음날 년 동안 개발자가 날짜와 함께하고있다 뭔가 얻을 수 있습니다. 이제 마이크로 소프트는이 간단한 기능을 처리 할 수있는 슈퍼 새로운 DATETIME2 필드가 있습니다.

    "하자의 사용 이전보다 더 나쁘다이 새로운 형태의"나는 그렇게 생각하지 않습니다!

  14. ==============================

    14.이보다 더 효율이 때문에, DATETIME2 날짜를 저장하는 더 나은 방법이라고 생각 날짜 시간. 당신이 DATETIME2를 사용하여 서버 2008 SQL에서는, 날짜와 시간을 저장하는 저장소에 6-8 바이트를 받아 100 나노초의 정밀도를 가지고있다. 더 많은 시간 정밀도를 필요로 사람이 DATETIME2를 원할 것입니다 그래서.

    이보다 더 효율이 때문에, DATETIME2 날짜를 저장하는 더 나은 방법이라고 생각 날짜 시간. 당신이 DATETIME2를 사용하여 서버 2008 SQL에서는, 날짜와 시간을 저장하는 저장소에 6-8 바이트를 받아 100 나노초의 정밀도를 가지고있다. 더 많은 시간 정밀도를 필요로 사람이 DATETIME2를 원할 것입니다 그래서.

  15. from https://stackoverflow.com/questions/1334143/datetime2-vs-datetime-in-sql-server by cc-by-sa and MIT license