문제

왜 sqldateTime.minValue가 dateTime.minValue와 같지 않습니까?

도움이 되었습니까?

해결책

SQL과 .NET의 차이점은 날짜 데이터 유형은 SQL Server가 날짜 시간 데이터 유형, 최소 및 최대 값이며 정밀도는 .NET의 DateTime Datatype보다 훨씬 오래되었습니다.

.NET의 출현으로 팀은 DateTime 데이터 유형에 더 많은 것을 가져야한다고 결정했습니다. 자연스러운 최소 값, 01/01/0001은 상당히 논리적 인 선택으로 보이며 확실히 프로그래밍 언어,보다는 데이터 베이스 관점에서,이 값은 더 자연 스럽다.

또한 SQL Server 2008에는 여러 가지 새로운 날짜 기반 데이터 타입이 있습니다.날짜, 시간, dateTime2, dateTimeOffset) 실제로 증가 된 범위와 정밀도를 제공하며 .NET의 DateTime Datatype에 밀접하게 매핑됩니다. 예를 들어 DateTime2 데이터 유형의 날짜 범위는 0001-01-01 ~ 9999-12-31입니다.

SQL Server의 표준 "DateTime"데이터 유형은 항상 최소 값이 01/01/1753입니다 (실제로 여전히 그렇습니다!). 나는이 가치의 중요성에 대해 궁금한 점이 있었다는 것을 인정해야한다.

서기 1 장에서 오늘날 사이의 기간 동안 서방 세계는 실제로 두 가지 주요 달력을 사용했습니다. Julius Caesar의 Julian Calendar와 Gregory XIII의 Gregorian 달력. 두 달력은 하나의 규칙에 대해서만 다릅니다. 윤년이 무엇인지 결정하는 규칙. Julian 달력에서는 4 년 만에 4 년 동안 나눌 수 있습니다. Gregorian 달력에서, 100 년으로 나눌 수있는 연도는 100 명 (400 명으로 나눌 수 없음)을 제외하고는 4 년 만에 나눌 수있는 연도가 약시가되었다. 따라서 1700 년, 1800 년 및 1900 년은 줄리안 달력에서 도약이지만 그레고리 캘린더에서는 그렇지 않지만 1600 년과 2000 년은 두 달력에서 두 년 동안 도약합니다.

교황 그레고리 XIII가 1582 년에 달력을 소개했을 때, 그는 1582 년 10 월 4 일과 1582 년 10 월 15 일 사이에 건너 뛰어야한다고 지시했다. 즉, 10 월 4 일 이후의 날은 10 월 15 일이어야한다고 말했다. 그래도 변화가 지연되었습니다. 영국과 그녀의 식민지는 1752 년까지 Julian에서 Gregorian Reckoning으로 전환하지 않았으므로 건너 뛰는 날짜는 1752 년 9 월 4 일과 9 월 14 일 사이에있었습니다. 다른 국가는 다른 시간에 전환되었지만 1582 년과 1752 년은 다음과 같은 관련 날짜입니다. 우리가 논의하고있는 DBMS.

따라서 몇 년이되면 날짜 산술에 두 가지 문제가 발생합니다. 첫 번째는 줄리안 또는 그레고리 규칙에 따라 스위치가 계산되기 몇 년 전에 도약해야합니까? 두 번째 문제는 건너 뛰는 날을 언제 그리고 어떻게 처리해야합니까?

이것이 Big Eight DBMS가 다음과 같은 질문을 처리하는 방법입니다.

  • 스위치가없는 척. 표준 문서는 불분명하지만 SQL 표준이 요구하는 것처럼 보이지만, "자연 규칙"이든 "Gregorian 달력을 사용한 날짜에 대한 자연 규칙에 따라 날짜가 제한된다고 말합니다. 이것은 DB2가 선택한 옵션입니다. 일정에 대해 듣지 못했을 때조차도 단일 달력의 규칙이 항상 적용되었다는 주장이있을 때, 기술 용어는 "분량"캘린더가 시행되고 있다는 것입니다. 예를 들어, 우리는 DB2가 분량 그레고리 캘린더를 따른다고 말할 수 있습니다.

  • 문제를 완전히 피하십시오. Microsoft와 Sybase는 1753 년 1 월 1 일에 최소 날짜 값을 설정하여 미국이 달력을 전환 한 시간을 안전하게 지났습니다. 이는 방어 할 수 있지만 때때로이 두 DBMS는 다른 DBMS가 가지고있는 유용한 기능이없고 SQL 표준에 필요한 유용한 기능이 부족하다는 불만이 있습니다.

  • 1582를 선택하십시오. 이것이 오라클이 한 일입니다. Oracle 사용자는 1582 년 10 월 15 일 1582 년 10 월 4 일 1582 년 10 월 4 일 값을 1 일 (10 월 5 ~ 14 일 존재하지 않기 때문에)의 값을 생산하고 2 월 29300 년 2 월 29 일 날짜가 유효하다는 것을 알게 될 것입니다 (Julian Leap- 연도 규칙이 적용됩니다). SQL 표준이 필요하지 않은 것처럼 Oracle이 추가로 문제가 발생 했는 이유는 무엇입니까? 대답은 사용자가 필요할 수 있다는 것입니다. 역사가와 천문학 자들은이 하이브리드 시스템을 분량 그레고리안 달력 대신 사용합니다. (이것은 또한 Java의 Gregoriancalendar 클래스를 구현할 때 Sun이 선택한 기본 옵션입니다. 이름에도 불구하고 Gregoriancalendar는 하이브리드 캘린더입니다.)

다음 링크에서 가져온 위의 인용문 :

SQL 성능 튜닝 : SQL의 날짜

다른 팁

SQL Server에서 DateTime 필드 (1753/1/1)에 저장할 수있는 최소 날짜는 DateTime .NET Data Type (0001/1/1)의 MinValue와 같지 않습니다.

1753은 그레고리 캘린더 (영국)의 첫 번째 채택 자 날짜였습니다. 이것이 왜 01/01/0001 이상으로 선정되었는지 - SQL Server가 1990 년대에 Sybase 일 때부터 의심의 여지가 없습니다. 그들은 초기에 디자인 결정을 내려야했고 Microsoft SQL 팀은이를 변경할 이유를 보지 못했습니다.

.NET가 폭발하고 IT를 SQL Server에 통합 한 이후로 현재 dateTime2 호환성을위한 객체. 당신이 nhibernate 사용자라면 이 유형을 제공 할 수 있습니다 당신의 타입 맵핑에서 피할 수 있습니다 DateTime.Min 문제

.NET 날짜는 Gregorian 외에 다른 달력을 수용합니다.

  • 달력
    • Chineselunisolarcalendar
    • Eastasianlunisolarcalendar
    • 그레고리 언 달력
    • 히브리어 칼렌 다
    • hijricalendar
    • 일본 세포
    • Japaneselunisolarcalendar
    • 줄리안 칼렌 다
    • Koreancalendar
    • Koreanlunisolarcalendar
    • 페르시아 칼렌 다
    • 대만
    • 대만 란 니토 솔 캘렌다르
    • Thaibuddhistcalendar
    • Umalquracalendar

Juliancalendar는 사전 날짜를 알립니다 DateTime.MinValue

두 그룹의 다른 그룹은 날짜/시간과 관련하여 "최소"가 무엇을 의미하는지 결정했습니다.

SQL uses a different internal representation for DateTime.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top