2011-07-04 13 views
22

que tienen una mesa y las fecha-hora en que se encuentran en el formato:¿Cómo pasar datetime de C# a sql correctamente?

2011-07-01 15:17:33.357 

que estoy tomando aC# DateTime cuando hago un .ToString() en el objeto que estoy recibiendo un DateTime en el formato :

04/07/2011 06:06:17 

me pregunto cómo me pase correctamente el DateTime correcta a través porque cuando corro el SQL que está en nuestro código no funciona (es decir, seleccionar la correcta DateTime). No puedo usar SQL profiler.

Este es el código:

//looks to if a user has had any activity in within the last time specified 
     public bool IsUserActivitySinceSuppliedTime(int userId, DateTime since) 
     { 
      //get everything since the datetime specified [usually 5 hours as this is 
      //how long the session lasts for 
      string sql = "SELECT * FROM tbl_webLogging WHERE userid = @userid AND DateAdded > @sinceDateTime"; 

      SqlParameter sinceDateTimeParam = new SqlParameter("@sinceDateTime", SqlDbType.DateTime); 
      sinceDateTimeParam.Value = since; 

      SqlCommand command = new SqlCommand(sql); 
      command.Parameters.AddWithValue("@userid", userId); 
      command.Parameters.Add(sinceDateTimeParam); 


      using (SqlDataReader DataReader = GetDataReader(command)) 
      { 
       if (DataReader.HasRows) 
       { 
        return true; 
       } 
       else 
       { 
        return false; 
       } 
      } 


     } 

ACTUALIZACIÓN *******************

He corrido lo siguiente en los datos:

SELECT * FROM tbl_webLogging 
WHERE userid = 1 
AND DateAdded > '2011-07-01 07:19:58.000' 

Y

SELECT * FROM tbl_webLogging 
WHERE userid = 1 
AND DateAdded > '04/07/2011 07:19:58' 

Uno vuelve 53 reco rds el otro devuelve 69 registros. ¿Cómo puede ser esto? Y cuando paso el DateTime (04/07/2011 07:19:58) de C# a SQL ¡no aparecen los registros!

+1

¿Cuál es el tipo de la columna "Fecha de inclusión" en su tabla? ¿Es DateTime? O algún tipo de varchar? –

+0

¿Puedes confirmar que 'DateAdded' tiene tipo' datetime', no algo como '[n] varchar (x)'? –

+0

Entonces, ¿por qué C# datetime regresa con 0 registros? (el depurador dice que es '07/07/2011 07:19:58 ') @Maras el tipo de datos es datetime .... – Exitos

Respuesta

19

Ya has hecho correctamente mediante el uso de un parámetro DateTime con el valor de la DateTime, por lo que debe ya está en acción. Olvídese de ToString() - ya que no se usa aquí.

Si hay una diferencia, es más probable que lo haga con una precisión diferente entre los dos entornos; tal vez elija un redondeo (¿segundos, quizás?) y use eso. También tenga en cuenta UTC/local/unknown (el DB no tiene ningún concepto del "tipo" de fecha; .NET sí).

que tienen una mesa y los datetimes en ella están en el formato: 2011-07-01 15:17:33.357

Tenga en cuenta que datetimes en la base de datos no están en cualquier formato; ese es solo su cliente de consulta que le muestra mentiras blancas. Se almacena como número (e incluso eso es un detalle de implementación), porque los humanos tienen esta extraña tendencia a no darse cuenta de que la fecha que ha mostrado es la misma que 40723.6371916281. Humanos estúpidos. Al tratarlo simplemente como un "datetime" en todo momento, no debería tener ningún problema.

+0

Simplemente no recuperar nada. NOTA: Solo decía que To.String era ... porque estoy buscando en el depurador. Pero cuando ejecuto el código anterior simplemente no obtendrá ninguna fila. ¿Cómo puedo depurar esto? – Exitos

+0

@ Pete2k, ¿hay datos coincidentes? y es un problema '>' vs '> ='? –

+0

He agregado una actualización – Exitos

6

Tuve muchos problemas relacionados con C# y SqlServer. Acabé haciendo lo siguiente:

  1. En SQL Server uso el DateTime columna de tipo
  2. En C# utilizo el .ToString ("AAAA-MM-dd hh: mm: ss") método

También asegúrese de que todas sus máquinas funcionen en la misma zona horaria.

En cuanto a los diferentes conjuntos de resultados que se obtiene, el primer ejemplo es "Julio Primera" mientras que el segundo es "4 de julio" ...

Además, el segundo ejemplo se puede también interpretarse como "7 de abril", depende de la configuración de localización del servidor (mi solución no sufre este problema).

+1

'.ToString (" aaaa-MM-dd hh: mm: ss ")' no es la mejor manera de eliminar la ambigüedad; la mejor manera es pasar datos tipeados, y por lo tanto no ser ambiguos. El código en la pregunta es * mejor * que el uso de 'ToString (...)' con cualquier formato en particular. –

+2

El código en cuestión no funciona por una razón u otra, por lo que la mejor solución sería hacer que el código funcione y proporcionar los resultados esperados. Después hay muchas cosas que considerar que equivaldrían a una solución "mejor". – Eden

+0

Uso '.ToString (aaaa-MM-ddThh: mm: ss)'. De alguna manera, así siempre sé qué esperar. Especificar el tipo a SqlDateTime no funcionó para mí una vez, terminé teniendo '2012-01-30 AM 10: 15: 30', mientras que en SQL fue' 2012-01-30 10: 15: 30'. No estoy seguro de por qué ... solo mis 2 centavos – nomail

Cuestiones relacionadas