Conversão de um tipo de dados datetime2 em um tipo de dados datetime resulta em um valor fora do intervalo

Eu tenho uma tabela de dados com 5 colunas, onde uma linha está sendo preenchida com dados, em seguida, salva no database através de uma transação.

Ao salvar, um erro é retornado:

A conversão de um tipo de dados datetime2 em um tipo de dados datetime resultou em um valor fora do intervalo

Isso implica, como lido, que minha tabela de dados possui um tipo de DateTime2 e meu database, um DateTime ; isso esta errado.

A coluna de data está definida para um DateTime como este:

new DataColumn("myDate", Type.GetType("System.DateTime"))

Questão

Isso pode ser resolvido em código ou algo tem que ser mudado em um nível de database?

Que tipo de datas você tem na coluna?

Todos eles se encheckboxm na faixa do tipo?


Como um aparte, a maneira correta de obter um object Type para o construtor DataColumn é a palavra-chave typeof , que é de magnitude mais rápida.

Portanto, para criar a coluna, você deve escrever

 new DataColumn("myDate", typeof(DateTime)) 

Isso pode acontecer se você não atribuir um valor a um campo DateTime quando o campo não aceitar valores NULL.

Isso consertou para mim!

Tanto o DATETIME quanto o DATETIME2 mapeiam para System.DateTime no .NET – você não pode realmente fazer uma “conversão”, já que é realmente o mesmo tipo .NET.

Veja a página do MSDN doc: http://msdn.microsoft.com/pt-br/library/bb675168.aspx

Existem dois valores diferentes para o ” SqlDbType ” para estes dois – você pode especificar aqueles na sua definição DataColumn ?

MAS: no SQL Server, o intervalo de datas suportado é bastante diferente.

DATETIME suporta 1753/1/1 para “eternidade” (9999/12/31), enquanto DATETIME2 suporta 0001/1/1 até a eternidade.

Então, o que você realmente precisa fazer é verificar o ano da data – se é antes de 1753, é necessário alterá-lo para algo AFTER 1753 para que a coluna DATETIME no SQL Server possa manipulá-lo.

Marc

No meu database do SQL Server 2008, eu tinha uma coluna DateTime marcada como não anulável, mas com uma function GetDate() como seu valor padrão. Ao inserir um novo object usando o EF4, recebi este erro porque não estava passando uma propriedade DateTime no meu object explicitamente. Eu esperava que a function SQL para lidar com a data para mim, mas isso não aconteceu. Minha solução foi enviar o valor de data do código em vez de confiar no database para gerá-lo.

 obj.DateProperty = DateTime.now; // C# 

para mim foi porque o datetime foi ..

01/01/0001 00:00:00

neste caso você quer atribuir null ao seu object EF DateTime … usando meu código FirstYearRegistered como um exemplo

 DateTime FirstYearRegistered = Convert.ToDateTime(Collection["FirstYearRegistered"]); if (FirstYearRegistered != DateTime.MinValue) { vehicleData.DateFirstReg = FirstYearRegistered; } 

Este estava me deixando louco. Eu queria evitar o uso de um tempo de data anulável ( DateTime? ). Eu não tinha a opção de usar o tipo datetime2 do SQL Server 2008

 modelBuilder.Entity().Property(e => e.MyDateColumn).HasColumnType("datetime2"); 

Eu finalmente optei pelo seguinte:

 public class MyDb : DbContext { public override int SaveChanges() { UpdateDates(); return base.SaveChanges(); } private void UpdateDates() { foreach (var change in ChangeTracker.Entries()) { 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; } } } } } } 

Às vezes a EF não sabe que está lidando com uma coluna computada ou um gatilho . Por design, essas operações definirão um valor fora do EF após uma inserção.

A correção é especificar Computed in EF’s edmx para essa coluna na propriedade StoreGeneratedPattern .

Para mim, foi quando a coluna teve um gatilho que inseriu a data e a hora atuais, veja abaixo na terceira seção.


Passos para resolver

No Visual Studio, abra a página Model Browser , em seguida, Model Entity Types ->

  1. Selecione a entidade e a propriedade de data e hora
  2. Selecione StoreGeneratedPattern
  3. Definir para Computed

Diálogo Tipo de Entidade do Model Browser Model EF


Para essa situação, outras respostas são soluções alternativas, pois o objective da coluna é ter um horário / data especificado quando o registro foi criado e que é o trabalho do SQL executar um acionador para adicionar o horário correto. Tal como este gatilho SQL:

DEFAULT (GETDATE()) FOR [DateCreated] .

Se não passarmos um campo de data e hora para data, a data padrão {1/1/0001 12:00:00 AM} será passada.

Mas essa data não é compatível com o trabalho de frameworks da entidade, portanto, a conversão de um tipo de dados datetime2 em um tipo de dados datetime resultou em um valor fora do intervalo

Apenas default DateTime.now para o campo de data, se você não estiver passando nenhuma data.

 movie.DateAdded = System.DateTime.Now 

Eu corri para isso e adicionei o seguinte à minha propriedade datetime:

  [Column(TypeName = "datetime2")] public DateTime? NullableDateTimePropUtc { get; set; } 

O mais fácil seria alterar o database para usar datetime2 em vez de datetime. A compatibilidade funciona bem e você não receberá seus erros.

Você ainda vai querer fazer um monte de testes …

O erro é provavelmente porque você está tentando definir uma data para o ano 0 ou algo assim – mas tudo depende de onde você tem controle para alterar as coisas.

Eu encontrei este post tentando descobrir porque eu continuei recebendo o seguinte erro que é explicado pelas outras respostas.

A conversão de um tipo de dados datetime2 em um tipo de dados datetime resultou em um valor fora do intervalo.

Use um object DateTime anulável.
public DateTime? PurchaseDate {get; conjunto; }

Se você estiver usando a estrutura de entidade Defina a propriedade anulável no arquivo edmx como True

Defina a propriedade anulável no arquivo edmx como ** Verdadeiro **

O Entity Framework 4 funciona com o tipo de dados datetime2, portanto, em db, o campo correspondente deve ser datetime2 para o SQL Server 2008.

Para obter a solução, existem duas maneiras.

  1. Para usar o tipo de dados datetime no Entity Framwork 4, você precisa alternar o ProviderManifestToken no arquivo edmx para “2005”.
  2. Se você definir o campo correspondente como Permitir nulo (converte NULLABLE), então EF usa automaticamente os objects de data como data e hora.

Como o andyuk já apontou, isso pode acontecer quando um valor NULL é atribuído a um campo DateTime não anulável. Considere mudar o DateTime para o DateTime? ou anulável < DateTime >. Lembre-se de que, no caso de você estar usando uma Propriedade de Dependência , também deve certificar-se de que o tipo da propriedade de dependência também seja do tipo DateTime anulável.

Abaixo está um exemplo da vida real de um DateTime incompleto para DateTime? ajuste de tipo que aumenta o comportamento estranho

insira a descrição da imagem aqui

Criei uma class base baseada na implementação @ sky-dev. Portanto, isso pode ser facilmente aplicado a vários contextos e entidades.

 public abstract class BaseDbContext : 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()) { 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; } } } } } } 

Uso:

 public class MyContext: BaseDbContext { ///  /// Initializes a new instance of the  class. ///  public MyContext() : base("name=MyConnectionString") { } ///  /// Initializes a new instance of the  class. ///  /// The connection string. public MyContext(string connectionString) : base(connectionString) { } //DBcontext class body here (methods, overrides, etc.) } 

No meu caso, estávamos lançando uma data para um datetime e recebemos esse erro. O que acontece é que a Data tem um mínimo “orientado pelo programador” de 01/01/0001, enquanto o DataWest fica preso em 1753

Combine isso com um erro de coleta de dados de nossa parte e você terá sua exceção!

Às vezes funciona bem em máquinas de desenvolvimento e não em servidores. No meu caso eu tive que colocar:

  

No arquivo web.config.

O fuso horário na máquina (Server) estava certo (para o local CO), mas o aplicativo da web não. Esta configuração foi feita e funcionou bem novamente.

Claro, todas as datas tinham valor.

: D

você terá a coluna de data que foi definida para lesathan o valor mínimo do tempo de data permitido como 1/1/1001.

Para superar esse problema, você pode definir o valor de data e hora adequado para sua propriedade e também definir outra propriedade mágica como IsSpecified = true.