datetime2 데이터 유형을 datetime 데이터 유형으로 변환하면 값이 범위를 벗어납니다.
5개의 열이 있는 데이터 테이블이 있는데, 한 행이 데이터로 채워지고 트랜잭션을 통해 데이터베이스에 저장됩니다.
저장 중 다음 오류가 반환됩니다.
datetime2 데이터 형식을 datetime 데이터 형식으로 변환한 결과 값이 범위를 벗어났습니다.
읽었듯이 데이터 합니다.DateTime2
내 a "Database"는DateTime
그것은 틀렸다.
은 짜로로 a로 되어 있습니다.DateTime
이렇게요.
new DataColumn("myDate", Type.GetType("System.DateTime"))
질문.
이 문제는 코드로 해결할 수 있습니까, 아니면 데이터베이스 차원에서 변경해야 합니까?
단답
이 문제는 DateTime 필드에 값을 초기화하지 않은 경우 발생할 수 있습니다.필드는 NULL 값을 받아들이지 않고 값 유형이기 때문에 NULL이 아닌 DateTime 유형의 기본값이 사용됩니다.
값을 설정해서 고정!
장황한 답변
「」의 값default(DateTime)
DateTime.MinValue
(오류)new DateTime(1, 1, 1)
01 "01/01/0001)이 .datetime
discloss.discloss 。
SQL Server datetime의 최소 유효값은 그레고리력을 사용하기 때문입니다.그러나 SQL Server DateTime2는 01/01/0001로 시작하는 날짜를 지원합니다.엔티티 프레임워크는 기본적으로 DateTime2를 사용하여 날짜를 나타내므로 생성된 SQL은 생성된 DateTime2 값을 SQL Server 측의 DateTime 값으로 암묵적으로 강제합니다.
다DATETIME
★★★★★★★★★★★★★★★★★」DATETIME2
에 기입하다System.DateTime
. 「은 할 수 때문입니다.NET 、 NET 、 NET 、 NET net net net net net net 。이것은 정말 같기 때문입니다.NET 입 net
MSDN 문서페이지 http://msdn.microsoft.com/en-us/library/bb675168.aspx 를 참조해 주세요.
두 다른 요.SqlDbType
2개의 - " " " " " " " " " " " " " " " " - " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "DataColumn
정??
단, SQL Server에서는 지원되는 날짜 범위가 상당히 다릅니다.
DATETIME
~ 31.한편, 1753/1/1은, 「999/12/31)」(999/12/31)에 대해서, 「」(999/31)를 서포트하고 있습니다.DATETIME2
0001/1/1 ~이렇게 하다.
해야 할 하는 것이고, 1753년 이후라는 을 1753년 이후라는 합니다.DATETIME
SQL Server の sql sql sql sql sql 。
마크
Server 2008이 .DateTime
"null로 플래그가 지정된 에는 null은 "null"로 표시됩니다.GetDate()
기본값으로 기능합니다.EF4를 사용하여 새 개체를 삽입할 때 개체에서 DateTime 속성을 명시적으로 전달하지 않았기 때문에 이 오류가 발생했습니다.SQL 함수로 날짜를 처리해 줄 것으로 예상했지만, 처리되지 않았습니다.제 해결책은 날짜 값을 생성하기 위해 데이터베이스에 의존하지 않고 코드에서 보내는 것이었습니다.
obj.DateProperty = DateTime.now; // C#
왜냐하면 그날은..
01/01/0001 00:00:00
이 경우 EF DateTime 객체에 null을 할당해야 합니다.예를 들어 First Year Registered 코드를 사용합니다.
DateTime FirstYearRegistered = Convert.ToDateTime(Collection["FirstYearRegistered"]);
if (FirstYearRegistered != DateTime.MinValue)
{
vehicleData.DateFirstReg = FirstYearRegistered;
}
★★★★★★★★★★★★★★★★★★★★★★★★★★는 늘 시간을 싶었다.DateTime?
2008의 Server 2008을 할 수 있는 datetime2
modelBuilder.Entity<MyEntity>().Property(e => e.MyDateColumn).HasColumnType("datetime2");
저는 결국 다음을 선택했습니다.
public class MyDb : DbContext
{
public override int SaveChanges()
{
UpdateDates();
return base.SaveChanges();
}
private void UpdateDates()
{
foreach (var change in ChangeTracker.Entries<MyEntityBaseClass>())
{
var values = change.CurrentValues;
foreach (var name in values.PropertyNames)
{
var value = values[name];
if (value is DateTime)
{
var date = (DateTime)value;
if (date < SqlDateTime.MinValue.Value)
{
values[name] = SqlDateTime.MinValue.Value;
}
else if (date > SqlDateTime.MaxValue.Value)
{
values[name] = SqlDateTime.MaxValue.Value;
}
}
}
}
}
}
EF는 가 계산된 열 또는 트리거를 처리하고 있는지 모를 수 있습니다.설계상 이러한 작업은 삽입 후 EF 외부에서 값을 설정합니다.
는 '명기하다'를 하는 것입니다.Computed
edmx
그 에 대해서StoreGeneratedPattern
★★★★★★★★★★★★★★★★★★.
컬럼에 현재 날짜와 시간을 삽입하는 트리거가 있을 때 세 번째 섹션을 참조하십시오.
해결 절차
에서 Visual Studio를 .★Model Browser
다음에 페이지하다Model
Entity Types
-> ★★
- 엔티티 및 날짜 시간 속성 선택
- 선택합니다.
StoreGeneratedPattern
- 「 」로 합니다.
Computed
이 경우 다른 답변은 회피책입니다.이 컬럼의 목적은 레코드가 작성된 시각/날짜를 지정하는 것입니다.이것은 SQL이 트리거를 실행하여 올바른 시간을 추가하는 것입니다.다음과 같은 SQL 트리거:
DEFAULT (GETDATE()) FOR [DateCreated]
이 경우 다음 항목을 datetime 속성에 추가했습니다.
[Column(TypeName = "datetime2")]
public DateTime? NullableDateTimePropUtc { get; set; }
날짜 시간 필드를 전달하지 않으면 기본 날짜 {1/1/0001 12:00:00 AM}이(가) 전달됩니다.
그러나 이 날짜는 엔티티 프레임 작업과 호환되지 않으므로 datetime 2 데이터 유형을 datetime 데이터 유형으로 변환하여 범위를 벗어난 값을 생성합니다.
★★★★★★★★★★★★★★★★★.default DateTime.now
[날짜(날짜)]필드로 이동합니다.
movie.DateAdded = System.DateTime.Now
가장 쉬운 방법은 데이터베이스를 datetime이 아닌 datetime2를 사용하도록 변경하는 것입니다.호환성이 뛰어나 오류가 발생하지 않습니다.
여전히 여러 가지 테스트를 하고 싶을 거야
이 오류는 아마도 날짜를 0년으로 설정하려고 하기 때문일 것입니다.다만, 이 모든 것은, 어디에서 변경할 수 있는가에 따라 다릅니다.
왜 다른 답변으로 설명되는 다음과 같은 오류가 계속 표시되는지 알아보려다 이 글을 발견했습니다.
datetime2 데이터 형식을 datetime 데이터 형식으로 변환하면 값이 범위를 벗어납니다.
가능한 object.null DateTime object.
개개날 개?? {get; set; }
엔티티 프레임워크를 사용하는 경우 edmx 파일의 null 가능 속성을 True로 설정합니다.
andyuk이 이미 지적했으므로 NULL 값이 NULL이 아닌 DateTime 필드에 할당되었을 때 발생할 수 있습니다.Date Time을 Date Time으로 변경하시겠습니까?또는 Nullable <Date Time>을 클릭합니다.Dependency Property를 사용하는 경우 Dependency Property의 유형도 NULL 가능한 DateTime 유형임을 확인해야 합니다.
다음은 홀수 동작을 유발하는 불완전한 Date Time to Date Time? 유형 조정의 실제 예입니다.
엔티티 프레임워크4는 datetime2 데이터 타입으로 동작하기 때문에 db에서 대응하는 필드는 SQL Server 2008의 datetime2여야 합니다.
해결책을 얻기 위해서는 두 가지 방법이 있다.
- 엔티티 Framwork 4에서 datetime 데이터 유형을 사용하려면 ProviderManifest를 전환해야 합니다.edmx 파일의 토큰을 "2005"로 지정합니다.
- 대응하는 필드를 Allow Null로 설정하면(NULLAB로 변환됩니다).LE)를 사용하면 EF는 자동으로 날짜 개체를 날짜/시간으로 사용합니다.
모델 클래스의 속성에 다음 속성을 추가합니다.
Attribute = [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
Reference = System.ComponentModel.DataAnnotations.Schema
처음에 이 속성을 추가하는 것을 잊었습니다.그래서 제 데이터베이스에서는 다음과 같은 제약이 생겼습니다.
ALTER TABLE [dbo].[TableName] ADD DEFAULT (getdate()) FOR [ColumnName]
이 속성을 추가하고 db를 업데이트한 후 로 변경했습니다.
ALTER TABLE [dbo].[TableName] ADD CONSTRAINT [DF_dbo.TableName_ColumnName] DEFAULT (getdate()) FOR [ColumnName]
@sky-dev 구현을 기반으로 기본 클래스를 만들었습니다.따라서 이는 여러 컨텍스트 및 엔티티에 쉽게 적용할 수 있습니다.
public abstract class BaseDbContext<TEntity> : DbContext where TEntity : class
{
public BaseDbContext(string connectionString)
: base(connectionString)
{
}
public override int SaveChanges()
{
UpdateDates();
return base.SaveChanges();
}
private void UpdateDates()
{
foreach (var change in ChangeTracker.Entries<TEntity>())
{
var values = change.CurrentValues;
foreach (var name in values.PropertyNames)
{
var value = values[name];
if (value is DateTime)
{
var date = (DateTime)value;
if (date < SqlDateTime.MinValue.Value)
{
values[name] = SqlDateTime.MinValue.Value;
}
else if (date > SqlDateTime.MaxValue.Value)
{
values[name] = SqlDateTime.MaxValue.Value;
}
}
}
}
}
}
사용방법:
public class MyContext: BaseDbContext<MyEntities>
{
/// <summary>
/// Initializes a new instance of the <see cref="MyContext"/> class.
/// </summary>
public MyContext()
: base("name=MyConnectionString")
{
}
/// <summary>
/// Initializes a new instance of the <see cref="MyContext"/> class.
/// </summary>
/// <param name="connectionString">The connection string.</param>
public MyContext(string connectionString)
: base(connectionString)
{
}
//DBcontext class body here (methods, overrides, etc.)
}
간단한 콘솔 앱 프로젝트에서 이 문제가 발생했습니다. 빠른 해결책은 다음 방법을 실행하여 가능한 datetime 2 날짜를 null 가능한 datetime으로 변환하는 것입니다.
static DateTime? ParseDateTime2(DateTime? date)
{
if (date == null || date.ToString() == "1/1/0001 12:00:00 AM")
{
return null;
}
else
{
return date;
}
}
이것은 확실히 완전히 포괄적인 방법은 아니지만, 내 요구에 잘 맞아서 다른 사람에게 도움이 될 수도 있어!
내 경우 Nullable Date Time 열에 NULL 값이 명시적으로 할당되어 변경 내용을 저장하려고 할 때.이 에러가 표시됩니다.
제 경우 Datetime에 Date를 캐스팅하다가 이 오류가 발생했습니다.Datetime이 1753에서 고정되는 동안 Date는 최소 "프로그래머 지향"이 01/01/0001입니다.
그것을 델의 데이터 수집 오류와 조합하면 예외입니다.
서버가 아닌 개발 머신에서 정상적으로 동작하는 경우가 있습니다.내 경우 다음과 같이 입력해야 합니다.
<globalization uiCulture="es" culture="es-CO" />
web.config 파일.
머신(서버)의 타임존은 (CO 로케일로) 맞았지만 웹 앱은 맞지 않았습니다.이 설정이 완료되어 다시 정상적으로 동작했습니다.
물론, 모든 데이트는 가치가 있었다.
:D
ASP의 클래스에 이 코드를 추가합니다.NET은 나에게 효과가 있었다:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Properties<DateTime>().Configure(c => c.HasColumnType("datetime2"));
}
저는 이 문제를 잘 알고 있습니다.여러분도 알고 있어야 합니다.
https://en.wikipedia.org/wiki/Year_2038_problem
SQL에서 이 문제를 피하기 위해 새 필드 유형이 생성되었습니다(datetime2).
이 '날짜' 필드 유형은 DateTime과 같은 범위 값을 가집니다.넷 클래스모든 문제를 해결할 수 있기 때문에 가장 좋은 방법은 데이터베이스 열 유형을 변경하는 것이라고 생각합니다(테이블 데이터에 영향을 주지 않습니다).
다음 두 가지를 확인합니다. 1) 이 필드에는 NULL 값이 없습니다.예를 들어 다음과 같습니다.
public DateTime MyDate { get; set; }
대체처:
public DateTime MyDate { get; set; }=DateTime.Now;
2) 데이터베이스를 다시 새로 만듭니다.예를 들어 다음과 같습니다.
db=new MyDb();
상속된 datetime 특성 문제
이 오류 메시지는 Null이 아닌 날짜 필드에 삽입/업데이트 시 값이 null인 경우에 자주 표시됩니다.한 가지 원인은 상속일 수 있습니다.
기본 클래스에서 상속된 날짜를 매핑하지 않으면 EF는 해당 값을 읽지 않습니다.
상세한 것에 대하여는, https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-3-table-per-concrete-type-tpc-and-choosing-strategy-guidelines 를 참조해 주세요.
usnig ASP 페이지를 편집하려고 했을 때 이 오류가 발생하였습니다.넷 MVC만드는 동안 문제가 없었지만 데이터베이스 업데이트로 DateCreated 속성이 범위를 벗어났습니다!
당신이 원하지 않을 때DateTime
속성은 Null이므로 해당 값이 sql DateTime 범위 내에 있는지 확인하고 싶지 않습니다(및@Html.HiddenFor
도움이 되지 않는다!)를 추가해 주세요.static DateTime
필드 내 관련 클래스(컨트롤러)에 GET 작동 시 값을 입력하고 POST 작동 시 값을 사용합니다.
public class PagesController : Controller
{
static DateTime dateTimeField;
UnitOfWork db = new UnitOfWork();
// GET:
public ActionResult Edit(int? id)
{
Page page = db.pageRepository.GetById(id);
dateTimeField = page.DateCreated;
return View(page);
}
// POST:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(Page page)
{
page.DateCreated = dateTimeField;
db.pageRepository.Update(page);
db.Save();
return RedirectToAction("Index");
}
}
DB의 req 형식을 확인합니다(예: my DB have Default value 또는 Binding).(((1)/(1))/(1900))
System.DateTime MyDate = new System.DateTime( 1900 ,1, 1);
저는 Devexpress DateEdit 컴포넌트를 가지고 있습니다.Devexpress DateEdit 컴포넌트는 Nullable 모델 속성을 통해 Nullable datetime MSQL 컬럼에 바인드되어 있습니다.DateEdit에서 AllowNullInput = True를 설정하기만 하면 됩니다."Default"로 설정하면 날짜 1.1.0001이 DateEdit을 종료하기 전만 표시됩니다.이 변환 에러 메세지는, 상기의 순서에 의해서 표시됩니다.
1/1/1001과 같이 허용된 dattime의 최소값을 resathan 하도록 설정된 date 열이 있습니다.
이 문제를 해결하려면 적절한 날짜/시간 값을 속성으로 설정하고 IsSpecified=true와 같은 다른 마법 속성을 설정할 수 있습니다.
Code First Context의 경우:
여기서부터 시작해
public DateTime Created { get; set; }
이거에 대해서., 그럼 여기에다가 더해져요.[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
여하하다
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime Created { get; set; }
를 선택합니다.
이것도 꼭 위에 추가해 주세요.
using System.ComponentModel.DataAnnotations.Schema;
언급URL : https://stackoverflow.com/questions/1331779/conversion-of-a-datetime2-data-type-to-a-datetime-data-type-results-out-of-range
'source' 카테고리의 다른 글
데이터베이스에 있는 모든 테이블의 크기를 가져옵니다. (0) | 2023.04.07 |
---|---|
테이블(아직 존재하지 않는 경우)에 열을 추가합니다. (0) | 2023.04.07 |
비프라이머리 키에 대한 외부 키 (0) | 2023.04.07 |
SQL - 문자열을 검색하는 동안 대/소문자 무시 (0) | 2023.04.07 |
첫 번째 줄에 가입하는 방법 (0) | 2023.04.07 |