Pregunta

Esperemos que esto debería ser simple. Al usar un selector de fecha y hora en un formulario de Windows, quiero que se lleve a cabo una declaración SQL, como por ejemplo:

string sql = "SELECT * FROM Jobs WHERE JobDate = '" + dtpJobDate.Text + "'";

Lamentablemente, esto en realidad no proporciona ningún resultado porque el campo Fecha de trabajo se almacena como un valor de Fecha y hora. Me gustaría poder buscar todos los registros que se encuentren en esta fecha, sin importar la hora almacenada, ¿alguna ayuda?

Nueva consulta:

        SqlDataAdapter da2 = new SqlDataAdapter();
        SqlCommand cmd = new SqlCommand();
        cmd.CommandText = "SELECT * FROM Jobs WHERE JobDate >= @p_StartDate AND JobDate < @p_EndDate";
        cmd.Parameters.Add ("@p_StartDate", SqlDbType.DateTime).Value = dtpJobDate.Value.Date;
        cmd.Parameters.Add ("@p_EndDate", SqlDbType.DateTime).Value = dtpJobDate.Value.Date.AddDays(1);
        cmd.Connection = conn;
        da2.SelectCommand = cmd;
        da2.Fill(dt);
        dgvJobDiary.DataSource = dt;

¡Muchas gracias por toda la ayuda!

¿Fue útil?

Solución

Solo una respuesta: use consultas parametrizadas .

Esto es por diferentes razones:

  • seguridad (sin riesgo de SQL Inyección
  • ya no son los problemas para los que está abriendo un tema
  • rendimiento.

Por lo tanto, escribe tu declaración como esta:

SqlCommand cmd = new SqlCommand();
cmd.CommandText = "SELECT * FROM Jobs WHERE JobDate = @p_Date"
cmd.Parameters.Add ("@p_Date", SqlDbType.DateTime).Value = dtpJobDate.Value;

Si desea ignorar el tiempo, entonces creo que lo mejor es hacer una búsqueda de rango, si el tiempo está almacenado en la base de datos, es decir. Algo como esto (solo la consulta SQL):

SELECT * FROM Jobs WHERE JobDate >= @p_StartDate AND JobDate < @p_EndDate

StartDate sería entonces dtpJobDate.Value.Date , y EndDate sería dtpJobDate.Value.Date.AddDays(1)

Si la hora no está almacenada en la base de datos, puede hacer esto:

SELECT * FROM Jobs WHERE JobDate = @p_Date

donde el argumento de búsqueda debe ser dtpJobDate.Value.Date

Otros consejos

Prueba dtpJobDate.Value.

Aparte de las cosas de inyección SQL en otras respuestas, puedes usar algo como esto:

dtpJobDate.Value.ToString("yyyyMMdd HH:mm:ss");

Pero es probable que no encuentre nada que coincida en el tiempo exacto, por lo que puede cambiar su consulta por algo como

string sql = "SELECT * FROM Jobs WHERE JobDate BETWEEN '" + dtpJobDateStart.Value.ToString("yyyyMMdd HH:mm:ss") + "' AND '" + + dtpJobDateEnd.Value.ToString("yyyyMMdd HH:mm:ss") + " + "'";

En primer lugar, ha dejado una puerta abierta para la inyección de SQL en su ejemplo.

Aparte de eso, para responder a tu pregunta, deberás eliminar los tiempos de la columna Fecha de trabajo para completar la coincidencia. Intente algo como esto (el código de inyección de SQL se deja en el ejemplo para comparación) ...

string sql = "SELECT * FROM Jobs WHERE CAST(CONVERT(CHAR(8), JobDate, 112) AS DATETIME) = '" + dtpJobDate.Text + "'";

Si tuviera que parametrizar su consulta, podría hacer algo como esto ...

using (var conn = new SqlConnection(myConnectionString))
using (var cmd = new SqlCommand("SELECT * FROM Jobs WHERE JobDate = @JobDate", conn))
{
    cmd.Parameters.Add(new SqlParameter("@JobDate", dtpJobDate.Value));

    conn.Open();
    using (var reader = cmd.ExecuteReader())
    {
        while (reader.Read())
        {
            // your code here to deal with the records...
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top