SqlDateTime.MinValue! = DateTime.MinValue, 왜?
왜 SqlDateTime.MinValue가 DateTime.MinValue와 같지 않은지 궁금합니다.
SQL과 .NET의 Date 데이터 유형 의 차이점은 SQL Server의 datetime 데이터 유형, 최소값 및 최대 값이며 정밀도가 .NET의 DateTime 데이터 유형보다 훨씬 오래 되었다는 사실에서 비롯된 것 같습니다.
.NET의 출현과 함께 팀은 Datetime 데이터 유형이 더 자연스러운 최소값을 가져야한다고 결정 했으며 01/01/0001은 상당히 논리적 선택이며 확실히 데이터베이스 관점 보다는 프로그래밍 언어 에서이 값은 다음과 같습니다. 더 자연 스럽습니다.
덧붙여서 SQL Server 2008에는 실제로 증가 된 범위와 정밀도를 제공하고 .NET의 DateTime 데이터 유형과 밀접하게 매핑되는 새로운 날짜 기반 데이터 유형 ( Date , Time , DateTime2 , DateTimeOffset )이 많이 있습니다. 예를 들어, DateTime2 데이터 유형의 날짜 범위는 0001-01-01에서 9999-12-31까지입니다.
SQL Server의 표준 "datetime"데이터 형식은 항상 최소값이 01/01/1753입니다 (실제로 여전히 있습니다!). 저도이 가치의 중요성에 대해 궁금해서 일부 파헤 치기도했습니다. 제가 발견 한 것은 다음과 같습니다.
서기 1 년부터 오늘까지 서구 세계는 실제로 줄리어스 카이사르의 율리우스 력과 그레고리 13 세의 그레고리력의 두 가지 주요 달력을 사용했습니다. 두 달력은 윤년을 결정하는 규칙 하나만 다릅니다. 율리우스 력에서 4로 나눌 수있는 모든 연도는 윤년입니다. 그레고리력에서 4로 나눌 수있는 모든 연도는 윤년입니다. 단, 100으로 나눌 수있는 연도 (400으로 나눌 수 없음)는 윤년이 아닙니다. 따라서 1700 년, 1800 년 및 1900 년은 율리우스 력에서는 윤년이지만 그레고리력에서는 그렇지 않은 반면 1600 년과 2000 년은 두 달력 모두에서 윤년입니다.
교황 그레고리 13 세가 1582 년 자신의 달력을 소개했을 때 그는 또한 1582 년 10 월 4 일부터 1582 년 10 월 15 일 사이의 날짜를 건너 뛰어야한다고 지시했습니다. 즉, 10 월 4 일 다음날은 10 월 15 일이어야한다고 말했습니다. 많은 국가 그래도 전환이 지연되었습니다. 잉글랜드와 그녀의 식민지는 1752 년까지 줄리안에서 그레고리 안 계산으로 전환되지 않았으므로, 생략 된 날짜는 1752 년 9 월 4 일에서 9 월 14 일 사이였습니다. 다른 국가는 다른 시간에 전환했지만 1582 년과 1752 년이 관련 날짜입니다. 우리가 논의하고있는 DBMS.
따라서 수년 전으로 거슬러 올라가면 날짜 산술에 두 가지 문제가 발생합니다. 첫 번째는 율리우스 또는 그레고리 안 규칙에 따라 전환이 계산되기 전에 윤년을 계산해야한다는 것입니다. 두 번째 문제는 건너 뛴 날짜를 언제 어떻게 처리해야 하는가입니다.
이것이 Big Eight DBMS가 이러한 질문을 처리하는 방법입니다.
스위치가없는 척하십시오. 표준 문서는 명확하지 않지만 SQL 표준이 요구하는 것 같습니다. "자연 규칙"이 무엇이든간에 날짜는 "그레고리력을 사용하는 날짜에 대한 자연 규칙에 의해 제한된다"고만 말합니다. 이것은 DB2가 선택한 옵션입니다. 달력에 대해 들어 본 사람이없는 시간에도 단일 달력의 규칙이 항상 적용되었다는 구실이있을 때 기술 용어는 "proleptic"달력이 적용된다는 것입니다. 예를 들어, DB2가 proleptic Gregorian 달력을 따른다고 말할 수 있습니다.
문제를 완전히 피하십시오. Microsoft와 Sybase는 미국이 달력을 전환 한 시간을 안전하게 지난 1753 년 1 월 1 일로 최소 날짜 값을 설정했습니다. 이것은 방어 할 수 있지만 때때로이 두 DBMS에는 다른 DBMS가 갖고 있고 SQL 표준이 요구하는 유용한 기능이 없다는 불만이 제기됩니다.
Pick 1582. 이것이 오라클이 한 일입니다. Oracle 사용자는 1582 년 10 월 15 일에서 1582 년 10 월 4 일을 뺀 날짜 산술식이 1 일의 값을 산출하고 (10 월 5-14 일이 존재하지 않기 때문에) 1300 년 2 월 29 일이 유효하다는 것을 알 수 있습니다. 연도 규칙이 적용됩니다). SQL 표준에서 요구하지 않는 것처럼 보이지만 Oracle이 추가 문제를 겪은 이유는 무엇입니까? 대답은 사용자가 필요할 수 있다는 것입니다. 역사가와 천문학 자들은 그레고리력이 아닌이 하이브리드 시스템을 사용합니다. (이것은 Java 용 GregorianCalendar 클래스를 구현할 때 Sun이 선택한 기본 옵션이기도합니다. 이름에도 불구하고 GregorianCalendar는 하이브리드 달력입니다.)
다음 링크에서 가져온 위의 인용문 :
SQL Server에서 datetime 필드 (1753/1/1)에 저장할 수있는 최소 날짜는 DateTime .NET 데이터 형식 (0001/1/1)의 MinValue와 같지 않습니다.
1753 년은 그레고리력 (영국)을 처음 채택한 날짜입니다. 이것이 01/01/0001 이상으로 선택된 이유에 관해서는 SQL Server가 1990 년대에 Sybase가되었을 때의 레거시입니다. 그들은 초기에 디자인 결정을 내렸음에 틀림없고 Microsoft SQL 팀은 그것을 변경할 이유를 보지 못했습니다.
.NET이 폭발하고 Sql Server에 통합 된 이후 이제 호환성을위한 DateTime2 개체가 있습니다. NHibernate 사용자 인 경우 문제 를 피하기 위해 유형 매핑 에이 유형 을 제공 할 수DateTime.Min 있습니다.
.NET 날짜는 그레고리 안 캘린더 외에 다른 캘린더를 제공합니다.
- 달력
- 중국어 LunisolarCalendar
- EastAsianLunisolarCalendar
- 그레고리 언 달력
- 히브리어 캘린더
- HijriCalendar
- 일본어 캘린더
- 일본어 LunisolarCalendar
- JulianCalendar
- 한국어 캘린더
- 한국어 LunisolarCalendar
- 페르시아 달력
- 대만 캘린더
- 대만 루니 솔라 캘린더
- 태국어 불교 달력
- UmAlQuraCalendar
JulianCalendar infact 이전 날짜 DateTime.MinValue
두 그룹은 날짜 / 시간과 관련하여 "최소"의 의미를 결정했습니다.
SQL은 DateTime에 대해 다른 내부 표현을 사용합니다.
참고 URL : https://stackoverflow.com/questions/805770/sqldatetime-minvalue-datetime-minvalue-why
'Program Club' 카테고리의 다른 글
| Jenkins 빌드에서 업데이트되지 않는 Git 하위 모듈 (0) | 2020.11.03 |
|---|---|
| Oracle 10g에서 테이블 열의 이름을 바꾸는 방법 (0) | 2020.11.03 |
| 호환되지 않는 문자 인코딩 : ASCII-8BIT 및 UTF-8 (0) | 2020.11.03 |
| 리모컨없이 모든 로컬 브랜치 나열 (0) | 2020.11.03 |
| sed에서 작은 따옴표를 이스케이프하는 방법은 무엇입니까? (0) | 2020.11.03 |