La conversión de un tipo de datos datetime2 a un tipo de datos datetime da como resultado un valor fuera de rango


Tengo una datatable con 5 columnas, donde una fila se llena con datos y luego se guarda en la base de datos a través de una transacción.

Al guardar, se devuelve un error:

La conversión de un tipo de datos datetime2 a un tipo de datos datetime resultó en un valor fuera de rango

Implica, como se lee, que mi datatable tiene un tipo de DateTime2 y mi base de datos a DateTime; eso está mal.

La columna de fecha se establece en un DateTime como este:

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

Pregunta

¿Se puede resolver esto en código o hay que cambiar algo a nivel de base de datos?

Author: ΩmegaMan, 2009-08-26

17 answers

¿Qué tipo de fechas tienes en la columna?

¿Caben todos ellos dentro del rango del tipo?


Como un aparte, la forma correcta de obtener un objeto Type para el constructor DataColumn es la palabra clave typeof, que es órdenes de magnitud más rápido.

Por lo tanto, para crear la columna, debe escribir

new DataColumn("myDate", typeof(DateTime))
 47
Author: SLaks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-26 00:55:05

Esto puede suceder si no asigna un valor a un campo DateTime cuando el campo no acepta valores NULL.

Eso lo arregló para mí!

 623
Author: andyuk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-26 11:45:26

Tanto DATETIME como DATETIME2 se asignan a System.DateTime en.NET - realmente no puede hacer una "conversión", ya que es realmente el mismo tipo de. NET.

Ver la página de MSDN doc: http://msdn.microsoft.com/en-us/library/bb675168.aspx

Hay dos valores diferentes para el "SqlDbType" para estos dos - puede especificar los en su definición DataColumn?

PERO: en SQL Server, el rango de fechas soportado es bastante diferente.

DATETIME apoya 1753/1/1 a la "eternidad" (9999/12/31), mientras DATETIME2 apoya 0001/1/1 a través de la eternidad.

Entonces, lo que realmente necesita hacer es verificar el año de la fecha: si es anterior a 1753, debe cambiarlo a algo POSTERIOR a 1753 para que la columna DATETIME en SQL Server lo maneje.

Marc

 137
Author: marc_s,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-22 21:58:58

En mi base de datos SQL Server 2008, tenía una columna DateTime marcada como no nullable, pero con una función GetDate() como su valor predeterminado. Al insertar un nuevo objeto usando EF4, obtuve este error porque no estaba pasando una propiedad DateTime en mi objeto explícitamente. Esperaba que la función SQL manejara la fecha por mí, pero no lo hizo. Mi solución fue enviar el valor de fecha desde el código en lugar de confiar en la base de datos para generarlo.

obj.DateProperty = DateTime.now; // C#
 38
Author: Graham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-01 08:59:48

Para mí fue porque el datetime era..

01/01/0001 00:00:00

En este caso desea asignar null a su objeto EF DateTime... usando mi código registrado del primer año como ejemplo

DateTime FirstYearRegistered = Convert.ToDateTime(Collection["FirstYearRegistered"]);
if (FirstYearRegistered != DateTime.MinValue)
{
    vehicleData.DateFirstReg = FirstYearRegistered;
}  
 26
Author: JGilmartin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-04 12:34:40

Este me estaba volviendo loco. Quería evitar usar una fecha y hora nullable (DateTime?). No tenía la opción de usar el tipo datetime2 de SQL Server 2008 tampoco

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

Finalmente opté por lo siguiente:

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;
                    }
                }
            }
        }
    }
}
 18
Author: sky-dev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-01 09:00:32

A veces EF no sabe que se trata de una columna calculada o de un disparador . Por diseño, esas operaciones establecerán un valor fuera de EF después de un inserto.

La solución es especificar Computed en EF edmx para esa columna en la propiedad StoreGeneratedPattern.

Para mí fue cuando la columna tenía un disparador que insertaba la fecha y hora actuales, ver a continuación en la tercera sección.


Pasos Para Resolver

En Visual Studio abre la página Model Browser luego Model luego Entity Types - > luego

  1. Seleccione la entidad y la propiedad date time
  2. Seleccione StoreGeneratedPattern
  3. Establecido en Computed

EF Model Browser Model Entity Type diálogo de Tipo de Entidad


Para esta situación, otras respuestas son soluciones alternativas, ya que el propósito de la columna es tener una hora/fecha especificada cuando se creó el registro, y ese es el trabajo de SQL para ejecutar un disparador para agregar la hora correcta. Como este desencadenador SQL:

DEFAULT (GETDATE()) FOR [DateCreated].

 18
Author: ΩmegaMan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-05 15:02:14

Si no pasamos un campo date time a date time, se pasará la fecha predeterminada {1/1/0001 12:00:00 AM}.

Pero esta fecha no es compatible con entity frame work por lo que lanzará la conversión de un tipo de datos datetime2 a un tipo de datos datetime dio como resultado un valor fuera de rango

Solo default DateTime.now al campo de fecha si no está pasando ninguna fecha .

movie.DateAdded = System.DateTime.Now
 7
Author: Lijo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-26 06:12:14

Me encontré con esto y agregué lo siguiente a mi propiedad datetime:

 [Column(TypeName = "datetime2")]
 public DateTime? NullableDateTimePropUtc { get; set; }
 6
Author: Rogala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-02 17:45:59

Lo más fácil sería cambiar su base de datos para usar datetime2 en lugar de datetime. La compatibilidad funciona muy bien, y no obtendrá sus errores.

Usted todavía querrá hacer un montón de pruebas...

El error se debe probablemente a que está tratando de establecer una fecha en el año 0 o algo así, pero todo depende de dónde tenga el control para cambiar las cosas.

 5
Author: Rob Farley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-23 10:31:31

Encontré este post tratando de averiguar por qué seguí recibiendo el siguiente error que se explica por las otras respuestas.

La conversión de un tipo de datos datetime2 a un tipo de datos datetime dio como resultado un valor fuera de rango.

Utilice un objeto DateTime anulable.
public DateTime? PurchaseDate { get; set;}

Si está utilizando entity framework Establezca la propiedad nullable en el archivo edmx en True

Establezca la propiedad nullable en el archivo edmx en * * True**

 3
Author: stink,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-29 19:53:41

El Entity Framework 4 funciona con el tipo de datos datetime2, por lo que en db el campo correspondiente debe ser datetime2 para SQL Server 2008.

Para lograr la solución hay dos maneras.

  1. Para usar el tipo de datos datetime en Entity Framwork 4 debe cambiar el ProviderManifestToken en el archivo edmx a "2005".
  2. Si establece el campo correspondiente como Permitir Null (lo convierte en NULLABLE), EF usa automáticamente los objetos date como datetime.
 2
Author: Mahmut C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-14 20:50:53

Como andyuk ya ha señalado, esto puede suceder cuando se asigna un valor NULL a un campo DateTime no nulo. Considere cambiar DateTime a DateTime? o NullableDateTime >. Tenga en cuenta que, en caso de que esté utilizando una Propiedad de dependencia , también debe asegurarse de que el tipo de su propiedad de dependencia también sea un tipo DateTime nullable.

A continuación se muestra un ejemplo de la vida real de un incompleto DateTime to DateTime? ajuste de tipo que aumenta el comportamiento impar

introduzca la descripción de la imagen aquí

 2
Author: Julio Nobre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:18:16

Se creó una clase base basada en la implementación de @sky-dev. Así que esto se puede aplicar fácilmente a múltiples contextos y entidades.

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;
                    }
                }
            }
        }
    }
}

Uso:

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.)
 }
 1
Author: wchoward,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-05 20:06:25

En mi caso estábamos lanzando una Fecha a una Fecha y tenemos este error. Lo que sucede es que Date tiene un mínimo "más orientado al programador" de 01/01/0001, mientras que Datetime está atascado en 1753

Combine eso con un error de recopilación de datos de nuestra parte, ¡y obtendrá su excepción!

 0
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:18:16

A veces funciona bien en máquinas de desarrollo y no en servidores. En mi caso tuve que poner :

<globalization uiCulture="es" culture="es-CO" />

En la web.archivo de configuración.

La zona horaria en la máquina (Servidor) era correcta (para la configuración regional de CO), pero la aplicación web no. Este ajuste hecho y funcionó bien de nuevo.

Fuera de curso, todas las fechas tenían valor.

: D

 0
Author: Jaime Enrique Espinosa Reyes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-13 16:02:04

Tendrá la columna de fecha que se estableció en lesathan el valor mínimo de dattime permitido como 1/1/1001.

Para superar este problema, puede establecer el valor de fecha y hora adecuado a la propiedad ur adn también establecer otra propiedad mágica como IsSpecified=true.

 -2
Author: Koteshwar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-19 05:26:47