programing

날짜 시간.MinValue 및 SqlDateTime 오버플로

starjava 2023. 7. 1. 07:57
반응형

날짜 시간.MinValue 및 SqlDateTime 오버플로

검사를 원하지 않습니다txtBirthDate그래서 합격하고 싶습니다.DateTime.MinValue데이터베이스에

내 코드:

 if (txtBirthDate.Text == string.Empty)
    objinfo.BirthDate = DateTime.MinValue;
 else
     objinfo.BirthDate =  DateTime.Parse(txtBirthDate.Text);

DateTime.MinValueDate = {1/1/0001 12:00:00 AM}

SQL 오류가 발생했습니다.

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

나는다니이해수이없습할해지그런왜만지하다없▁i니습.DateTime.MinValue데이터베이스에 삽입할 수 없는 잘못된 날짜 시간을 반환합니다.이러한 상황을 어떻게 처리해야 합니까?

매우 간단하여 사용을 피할 수 있습니다.DateTime.MinValue사용하다System.Data.SqlTypes.SqlDateTime.MinValue대신.

기적으사안함용로본함을 사용하지 DateTime.MinValue결측값을 나타냅니다.사용할 수 없습니다.DateTime.MinValue필드에는 입니다. SQL Server 1753은 SQL Server 1753입니다.

여러분의 신에, 당의를 .BirthDate을 대다Nullable<DateTime> (일명)DateTime?), 으로 설정합니다.null당신이 가치가 없을 때.또한 데이터베이스 필드가 null인지 확인합니다.그렇다면 당신은 단지 그것이 당신의 것인지 확인하기만 하면 됩니다.null로 끝납니다.NULL값을 입력합니다.정확한 방법은 데이터 액세스에 따라 달라지는데, 이에 대해서는 아무 것도 알려주지 않았습니다.

음... SQL 최소 날짜를 얻는 것은 꽤 간단합니다.

DateTime sqlMinDateAsNetDateTime = System.Data.SqlTypes.SqlDateTime.MinValue.Value;

오래된 질문이지만 다른 해결책은 데이터베이스 열에 datetime2를 사용하는 것입니다. MSDN 링크

MSDN에서:

1753년 1월 1일부터 9999년 12월 31일까지의 날짜 및 시간 데이터로, 정확도는 3.33밀리초입니다.값은 .000, .003 또는 .007 밀리초 단위로 반올림됩니다.두 개의 4바이트 정수로 저장됩니다.처음 4바이트에는 기준 날짜인 1900년 1월 1일 이전 또는 이후의 일 수가 저장됩니다.기준 날짜는 시스템의 참조 날짜입니다.1753년 1월 1일 이전 날짜 시간 값은 허용되지 않습니다.나머지 4바이트는 자정 이후의 밀리초로 표시되는 시간을 저장합니다.초의 유효 범위는 0 ~ 59입니다.

SQL은 DateTime 값에 대해 C#과 다른 시스템을 사용합니다.

MinValue를 Sentinel 값으로 사용할 수 있으며 MinValue인 경우 null을 개체에 전달하고 DB에 null로 날짜를 저장할 수 있습니다.

if(date == dateTime.Minvalue)
    objinfo.BirthDate = null;

여기 당신이 할 수 있는 것이 있습니다.비록 그것을 이루기 위한 많은 방법들이 있지만요.

DateTime? d = null;    
if (txtBirthDate.Text == string.Empty)
    objinfo.BirthDate = d;
else
    objinfo.BirthDate =  DateTime.Parse(txtBirthDate.Text);

참고: 데이터베이스 datetime 열이 Allow Null인 경우에만 작동합니다.그렇지 않으면 DateTimed에 대한 표준 최소값을 정의할 수 있습니다.

간단히 말해서, 사용하지 않음DateTime.MinVaue기본값으로 설정합니다.

몇 가지 다른 것들이 있습니다.MinValues당신이 어떤 환경에 있는지에 따라, 밖에 있습니다.

Windows CE 프로젝트를 구현하고 프레임워크의 프로젝트를 사용한 적이 있습니다.DateTime.MinValue(0001년), 데이터베이스MinValue(1753) 및 UI 컨트롤DateTimePicker(1970년이었던 것 같습니다.)따라서 이상한 행동과 예상치 못한 결과를 초래한 최소 3개의 MinValues가 있었습니다. (그리고 심지어 4번째 버전(!)도 있었다고 생각합니다. 어디서 왔는지 기억이 나지 않습니다.)

null 가능한 데이터베이스 필드를 사용하고 값을 다음으로 변경합니다.Nullable<DateTime>대신.코드에 유효한 값이 없을 경우 데이터베이스에도 값이 있으면 안 됩니다. :-)

이 기능을 사용하여 구문 분석을 시도하고 있습니다.

public static bool TryParseSqlDateTime(string someval, DateTimeFormatInfo dateTimeFormats, out DateTime tryDate)
    {
        bool valid = false;
        tryDate = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue;
        System.Data.SqlTypes.SqlDateTime sdt;
        if (DateTime.TryParse(someval, dateTimeFormats, DateTimeStyles.None, out tryDate))
        {
            try
            {
                sdt = new System.Data.SqlTypes.SqlDateTime(tryDate);
                valid = true;
            }
            catch (System.Data.SqlTypes.SqlTypeException ex)
            {

            }
        }

        return valid;
    }

DATTIME2를 사용하는 경우 매개 변수를 DATTIME2로 전달해야 할 수 있습니다. 그렇지 않으면 매개 변수를 DATTIME으로 변환하는 데 도움이 되고 동일한 문제가 발생할 수 있습니다.

command.Parameters.Add("@FirstRegistration",SqlDbType.DateTime2).Value = installation.FirstRegistration;

내선 번호 사용

public static class DateTimeExtensions
{
    public static DateTime MinValue(this DateTime sqlDateTime)
    {
        return new DateTime(1900, 01, 01, 00, 00, 00);
    }
}


DateTime date = DateTime.Now;
Console.WriteLine("Minvalue is {0} ", date.MinValue().ToShortDateString());

언급URL : https://stackoverflow.com/questions/15157328/datetime-minvalue-and-sqldatetime-overflow

반응형