Utc Fecha de guardado como fecha local en Sqlite

c# dapper datetime sql sqlite

Pregunta

Tengo una base de datos Sql que contiene un campo de fecha.

Yo uso Dapper para actualizar la base de datos de la siguiente manera:

const string sql = "UPDATE AdminDb.Users " +
                   "SET IsLoggedOn = 1, LastLoggedOn = @LastLoggedOn " +
                   "WHERE Username = @username";
var date = DateTime.UtcNow;
DatabaseConnectionBase.DatabaseConnection.Execute(sql, new { username, LastLoggedOn = date });

Estoy encontrando para mi gran molestia cuando se rompe antes de la actualización real, la fecha de la variable lee 30/3/2015 9:32:54 sin embargo cuando ejecuto la actualización la base de datos guarda la fecha como 30/3/2015 10:32:54

Como el Reino Unido cambió ayer de GMT a BST (UTC +1), estoy seguro de que la base de datos parece estar tratando de compensar esto, ya que este problema nunca apareció antes.

Pensé que había evitado este tipo de problema utilizando la propiedad DateTime.UtcNow para guardar mi fecha.

Esto está causando problemas serios al validar usuarios.

  • Estoy seguro de que no es mi código, ya que la fecha es correcta en el método Dapper Execute.
  • No puedo ver por qué Dapper intentaría compensar, ya que la mayoría de los desarrolladores gritarían ante tal funcionalidad
  • Lo que me lleva a la conclusión de que debe ser algo en Sqlite lo que está causando este problema. Quizás hay un pragma que necesito correr?

Según una sugerencia de otro sitio intenté formatear la fecha de la siguiente manera:

var date = DateTime.UtcNow.ToString("o");

La intención era forzar la fecha en formato ISO-8601 pero no tuve suerte con eso.

¿Alguien tiene alguna idea?

Respuesta aceptada

Esto me pasó a mí también. Lo que hice fue serializar la fecha y hora en una cadena yo mismo antes de agregarlo como parámetro.

internal const string DateTimeFormat = "yyyy-MM-dd HH:mm:ss";
cmd.Parameters.Add("@Threshold", DbType.DateTime).Value = threshold.ToString(DateTimeFormat);

Respuesta experta

Si haces lo mismo con ADO.NET puro, ¿ocurre lo mismo? Me pregunto si esto es algo de una base de datos o de proveedor, en lugar de una cuestión de biblioteca. Dapper tiene ToLocalTime() o ToUniversalTime() - pasa el tiempo sin modificaciones. En SQL Server, lo siguiente funciona bien en una configuración BST:

    public void SO29343103_UtcDates()
    {
        const string sql = "select @date";
        var date = DateTime.UtcNow;
        var returned = connection.Query<DateTime>(sql, new { date }).Single();
        var delta = returned - date;
        Assert.IsTrue(delta.TotalMilliseconds >= -1 && delta.TotalMilliseconds <= 1);
    }


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué