programing

오류 - SqlDateTime 오버플로입니다.1/1/1753 오전 12:00 ~ 12/31/9999 오후 11:59:59 사이여야 합니다.

newstyles 2023. 5. 29. 09:58

오류 - SqlDateTime 오버플로입니다.1/1/1753 오전 12:00 ~ 12/31/9999 오후 11:59:59 사이여야 합니다.

저는 제가 작성한 이 코드를 사용해왔고 그것은 가장 불분명한 방식으로 작동하고 있습니다.Database에 DateTime 열 두 개가 포함된 행을 삽입하려고 합니다.

myrow.ApprovalDate = DateTime.Now
myrow.ProposedDate = DateTime.Now

그러나 데이터베이스를 업데이트할 때 다음 오류가 발생합니다.

SqlDateTime 오버플로입니다.1/1/1753 오전 12:00 ~ 12/31/9999 오후 11:59:59 사이여야 합니다.

데이터베이스에서 삽입된 값을 복사하여 업데이트 중인 개체에 하드 코드화하기도 했습니다.

// I copied this value from the DB
myrow.ApprovalDate =  Convert.ToDateTime("2008-12-24 00:00:00.000");

여전히 동일한 오류입니다. 이상한 부분은 위의 트릭이 DB에 대한 첫 번째 삽입에 효과가 있었지만 그 이후로 실패했다는 것입니다.무슨 일인지 아십니까?

A DateTimeC#의 값 형식은 참조 형식이 아니므로 null일 수 없습니다. 그나러일상수있습다니수▁▁the다니있이 될 수 있습니다.DateTime.MinValue 서버s 를 .DATETIME데이터 형식

값 유형은 항상 명시적으로 설정할 필요 없이(이 경우 DateTime) 항상 (기본값) 값(0)을 갖도록 보장됩니다.최소값).

결론적으로 데이터베이스에 전달하려는 DateTime 값이 설정되지 않은 것 같습니다.

DateTime.MinValue = 1/1/0001 12:00:00 AM
DateTime.MaxValue = 23:59:59.9999999, December 31, 9999, 
                    exactly one 100-nanosecond tick 
                    before 00:00:00, January 1, 10000

MSDN: 날짜 시간.최소값


SQL 서버 정보

datetime 시간
1753년 1월 1일부터 9999년 12월 31일까지의 날짜 및 시간 데이터는 1/300초의 정확도(3.33밀리초 또는 0.0033초에 해당)입니다.은 0 0.007초 단위로 .000, .003 는 .007 또 단 반 됩 니 림 다올위로초값00다▁values

데이트
1900년 1월 1일부터 2079년 6월 6일까지 정확한 날짜 및 시간 데이터입니다. 29.998초 이하의 작은 날짜 시간 값은 가장 가까운 분으로 반올림되고 29.999초 이상의 값은 가장 가까운 분으로 반올림됩니다.

MSDN: SQL Server 날짜작은 날짜


마지막으로, 만약 당신이 C#를 통과하는 자신을 발견한다면.DateTime최대 정밀도를 유지하고 sql 서버가 유사한 오류를 발생시키지 않도록 하려면 sql에 대한 문자열 형식을 다음과 같이 지정해야 합니다.

string sqlTimeAsString = myDateTime.ToString("yyyy-MM-ddTHH:mm:ss.fff");

업데이트(8년 후)

sql ▁sql다를 사용하는 것을 .DateTime2 .net과 더 잘 DateTime 범위가 짜날범 로위로인 경우0001-01-01 through 9999-12-31 범위 및 간 시 위 범00:00:00 through 23:59:59.9999999

string dateTime2String = myDateTime.ToString("yyyy-MM-ddTHH:mm:ss.fffffff");

MSDN datetime2(Transact-SQL)

DB 관련 오류가 많이 발생한 후 SQL 최소/최대 날짜에 다음을 사용하는 것이 매우 효과적입니다.

DateTime rngMin = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue;

DateTime rngMax = (DateTime)System.Data.SqlTypes.SqlDateTime.MaxValue;

를 비교할 때 주의하십시오.Net DateTime to SqlDateTime.최소값 또는 최대값.예를 들어, 다음은 예외를 발생시킵니다.

DateTime dte = new DateTime(1000, 1, 1);
if (dte >= SqlDateTime.MinValue)
    //do something

그 이유는 MinValue가 DateTime이 아닌 SqlDateTime을 반환하기 때문입니다.따라서 .Net은 비교를 위해 SqlDateTime으로 변환하려고 하지만 허용 가능한 SqlDateTime 범위를 벗어났기 때문에 예외를 던집니다.

이에 대한 한 가지 해결책은 DateTime을 SqlDateTime과 비교하는 것입니다.최소값.가치.

DateTime 유형의 변수를 null로 설정하려는 경우 이 오류가 발생합니다.변수를 null로 선언합니다(예: DateTime?).이것으로 문제가 해결될 것입니다.

두 열의 코드는 괜찮아 보입니다.해당 매핑 클래스에서 다른 날짜/시간 열을 찾습니다.또한 쿼리 및 매개 변수를 보려면 데이터 컨텍스트에서 로깅을 사용 가능으로 설정합니다.

dc.Log = Console.Out;

DateTime이 c#의 0(0001-01-01)으로 초기화됩니다.이 메시지는 linqtosql을 통해 sql 문자열 리터럴 '0001-01-01'을 통해 데이터베이스로 전송됩니다.Sql은 이 날짜 이후의 T-Sql 날짜 시간을 구문 분석할 수 없습니다.

이 문제를 해결하는 몇 가지 방법이 있습니다.

  • SQL이 처리할 수 있는 값으로 모든 날짜 시간을 초기화해야 합니다(예: Sql의 0: 1900-01-01).
  • 때때로 생략될 수 있는 날짜 시간이 null일 수 있는지 확인합니다.

즉, 일반적으로 원하는 값 대신 null이 쿼리에 게시된다는 의미입니다. SQL Profiler를 실행하여 linq에서 SQL Server로 전달되는 내용을 정확히 확인할 수 있습니다.

을 때로코 적쓰게를위기 SQL 서날짜설, 와간및 ID 때때다로 하여 삽입 시가 날짜,, 하는 데 .GETDATE()또는NEWID().

이러한 경우 엔티티 클래스에 있는 필드의 자동 생성 값 속성을 true로 설정해야 합니다.

이렇게 하면 코드에서 값을 설정할 필요가 없으며(에너지 소비를 방지합니다!!!) 절대로 예외를 볼 수 없습니다.

확장 방법 사용

 public static object ToSafeDbDateDBnull(this object objectstring)
    {
        try
        {
            if ((DateTime)objectstring >= SqlDateTime.MinValue)
            {
                return objectstring;
            }
            else
            {
                return DBNull.Value;
            }
        }
        catch (Exception)
        {

            return DBNull.Value;
        }

    }

DateTime objdte = new DateTime(1000, 1, 1);
dte.ToSafeDbDateDBnull();

Datetime처럼 Datetime 하면 null을 합니다.DateTime?당신의 모델에서는 예외를 두지 않습니다.

저는 제 경우에 이렇게 문제를 해결했습니다.

일반적으로 DateTime 변환 또는 구문 분석을 수행할 때 이러한 오류가 발생합니다.응용프로그램이 호스트되는 서버의 일정관리 설정(주로 표준시 및 짧은 날짜 형식)을 확인하고 위치에 대한 올바른 표준시로 설정되었는지 확인합니다.이것으로 문제가 해결되기를 바랍니다.

저도 같은 것을 보고 있습니다.행 삽입 시 오류가 발생하지 않고 업데이트 시 오류가 발생합니다.내가 참조하는 테이블에는 두 개의 DateTime 열이 있는데 둘 다 null이 아닙니다.

시나리오를 요약하면 행을 가져와서 즉시 저장할 수 있습니다(데이터 변경 없음).get은 정상적으로 작동하지만 업데이트는 실패합니다.

우리는 NHibernate 3.3.1.4000을 사용하고 있습니다.

NHibernate를 사용하는 경우 매핑에서 null인 해당 DateTime 속성이 null로 설정되어 있는지 확인합니다.

나의 경우 테이블 날짜 열이 null일 수 없기 때문에 이 오류가 발생했습니다.

아래와 같이:

Create Table #TempTable(
 ...
 ApprovalDate datatime not null.
 ...)

이 오류를 방지하려면 null로 설정합니다.

 Create Table #TempTable(
 ...
 ApprovalDate datatime null.
 ...)

db 열 유형을 다음으로 변경합니다.datetime2쿼리/명령 생성자에 추가합니다.

SqlMapper.AddTypeMap(typeof(DateTime), System.Data.DbType.DateTime2);

DateTime이 있는 모델이 있었지만 데이터베이스 테이블 열에 Null DateTime이 필요했습니다.

모델을 DB에 삽입할 때 ORM이 빈 필드를 제공하여 SQL Server에서 SqlDateTime 오버플로 예외를 발생시켰습니다.해결책은 모델 DateTime 필드를 null로 만들어 ORM이 필드를 삽입하고 아무것도 없을 때 빈 필드 대신 DBNull 값을 제공하는 것입니다.

상황에 따라 Dapper ORM을 사용하던 중 이 문제가 발생했습니다.

날짜 시간.최소 값 및 날짜 시간.최대값

DateTime.MinValue = 1/1/0001 12:00:00 AM

DateTime.MaxValue = 23:59:59.9999999, December 31, 9999, 

                exactly one 100-nanosecond tick 

                before 00:00:00, January 1, 10000 

언급URL : https://stackoverflow.com/questions/468045/error-sqldatetime-overflow-must-be-between-1-1-1753-120000-am-and-12-31-999