programing

SqlDateTime입니다.최소값!= 날짜 시간.MinValue, 왜?

telebox 2023. 6. 21. 22:31
반응형

SqlDateTime입니다.최소값!= 날짜 시간.MinValue, 왜?

왜 SqlDateTime인지 궁금합니다.MinValue가 DateTime과 다릅니다.최소값?

저는 SQL과 의 차이점이 있다고 생각합니다.NET의 Date 데이터 유형은 SQL Server의 Datetime 데이터 유형, 최소값 및 최대값, 정확도가 보다 훨씬 오래되었다는 사실에서 비롯되었습니다.NET의 DateTime 데이터 유형입니다.

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

참고로 SQL Server 2008에서는 범위와 정밀도가 향상되고 .NET의 DateTime 데이터 유형과 밀접하게 매핑되는 여러 가지 새로운 날짜 기반 데이터 유형(날짜, 시간, DateTime2, DateTimeOffset)이 있습니다.예를 들어 DateTime2 데이터 유형의 날짜 범위는 0001-01-01 ~ 9999-12-31입니다.

SQL Server의 표준 "datetime" 데이터 유형은 항상 최소값이 01/01/1753입니다(지금도 있습니다!).인정합니다. 저도 이 가치의 중요성에 대해 궁금했고, 발굴도 했습니다.제가 발견한 것은 다음과 같습니다.

서기 1년부터 오늘날 사이의 기간 동안, 서구 세계는 실제로 두 개의 주요 달력을 사용했습니다: 줄리어스 시저의 율리우스력과 교황 그레고리오 13세의 그레고리력.두 달력은 윤년을 결정하는 규칙인 하나의 규칙에 대해서만 다릅니다.율리우스력에서, 4로 나눌 수 있는 모든 해는 윤년입니다.그레고리력에서 100으로 나눈 연도(400으로 나눈 것은 아님)가 윤년이 아닌 것을 제외하고 4로 나눈 모든 연도는 윤년입니다.따라서 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가 선택한 옵션입니다.아무도 달력을 들어본 적이 없는 시간에도 단일 달력의 규칙이 항상 적용되어 왔다는 가식이 있을 때, 전문 용어는 "전식적인" 달력이 시행된다는 것입니다.예를 들어 DB2가 태양력을 따른다고 볼 수 있습니다.

  • 문제를 완전히 피하세요.Microsoft와 Sybase는 미국이 달력을 바꾼 시간을 안전하게 넘긴 1753년 1월 1일에 최소 날짜 값을 설정했습니다. 이는 방어할 수 있지만, 이러한 두 DBMS에는 다른 DBMS와 SQL Standard가 요구하는 유용한 기능이 없다는 불만이 때때로 제기됩니다.

  • 1582를 고르세요.이것이 오라클이 한 일입니다.Oracle 사용자는 10월 1582에서 10월 4일을 뺀 날짜-산술 표현식이 1일의 값을 산출하고(10월 5일부터 14일까지 존재하지 않기 때문에) 1300년 2월 29일이 유효하다는 것을 알게 됩니다(줄리안 윤년 규칙이 적용되기 때문에).SQL Standard에 필요하지 않은 것 같은데 Oracle에 문제가 생긴 이유는 무엇입니까?정답은 사용자가 필요로 할 수도 있다는 것입니다.역사학자들과 천문학자들은 태양력 대신에 이 혼합 체계를 사용합니다.(Java용 GregoryCalendar 클래스를 구현할 때 Sun이 선택한 기본 옵션이기도 합니다. 이름에도 불구하고 GregoryCalendar는 하이브리드 달력입니다.

위의 인용문은 다음 링크에서 발췌한 것입니다.

SQL 성능 조정: SQL 날짜

SQL Server에서 날짜 시간 필드(1753/1/1)에 저장할 수 있는 최소 날짜가 DateTime .NET 데이터 유형의 최소값(0001/1)과 같지 않기 때문입니다.

1753년은 그레고리력을 처음으로 채택한 날입니다.01/01/0001보다 선택된 이유에 대해서는 의심할 여지 없이 1990년대 SQL Server가 Sybase였을 때의 유산입니다.그들은 설계 결정을 일찍 내렸을 것이고 마이크로소프트 SQL 팀은 이를 변경할 이유를 찾지 못했습니다.

.NET이 폭발적으로 증가하고 SQL Server에 통합된 이후 호환성을 위한 DateTime2 개체가 있습니다.NHibernate 사용자인 경우 유형 매핑에 이 유형을 제공하여 다음을 방지할 수 있습니다.DateTime.Min문제

.NET 날짜는 그레고리력 외에 다른 달력에도 적용됩니다.

  • 달력
    • 중국 음력
    • 동아시아 음력
    • 그레고리력
    • 히브리어 달력
    • 히즈리 달력
    • 일본 달력
    • 일본 음력
    • 율리안 캘린더
    • 한국의 달력
    • 한국의 음력
    • 페르시아력
    • 타이완 달력
    • 타이완 음력
    • 타이 불교 달력
    • UmAlQura 캘린더

사실 줄리언 달력은 날짜 이전입니다.DateTime.MinValue

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

SQL은 DateTime에 대해 다른 내부 표현을 사용합니다.

언급URL : https://stackoverflow.com/questions/805770/sqldatetime-minvalue-datetime-minvalue-why

반응형