sql >> Base de Datos >  >> RDS >> Sqlserver

Uso de DateTime en un SqlParameter para procedimiento almacenado, error de formato

¿Cómo está configurando el SqlParameter? ? Debe establecer el SqlDbType propiedad a SqlDbType.DateTime y luego pase el DateTime directamente al parámetro (NO convierta a una cadena, entonces está buscando un montón de problemas).

Debería poder obtener el valor en la base de datos. Si no, aquí hay un ejemplo muy simple de cómo hacerlo:

static void Main(string[] args)
{
    // Create the connection.
    using (SqlConnection connection = new SqlConnection(@"Data Source=..."))
    {
        // Open the connection.
        connection.Open();

        // Create the command.
        using (SqlCommand command = new SqlCommand("xsp_Test", connection))
        {
            // Set the command type.
            command.CommandType = System.Data.CommandType.StoredProcedure;

            // Add the parameter.
            SqlParameter parameter = command.Parameters.Add("@dt",
                System.Data.SqlDbType.DateTime);

            // Set the value.
            parameter.Value = DateTime.Now;

            // Make the call.
            command.ExecuteNonQuery();
        }
    }
}

Creo que parte del problema aquí es que le preocupa que el hecho de que la hora esté en UTC no se transmita a SQL Server. Con ese fin, no debería, porque SQL Server no sabe que una hora en particular se encuentra en una zona horaria/local en particular.

Si desea almacenar el valor UTC, conviértalo a UTC antes de pasarlo a SQL Server (a menos que su servidor tenga la misma zona horaria que el código del cliente que genera el DateTime , e incluso entonces, eso es un riesgo, en mi opinión). SQL Server almacenará este valor y cuando lo recupere, si desea mostrarlo en la hora local, debe hacerlo usted mismo (que el DateTime struct lo hará fácilmente).

Dicho todo esto, si realiza la conversión y luego pasa la fecha UTC convertida (la fecha que se obtiene llamando a ToUniversalTime método, no mediante la conversión a una cadena) al procedimiento almacenado.

Y cuando recupere el valor, llame a ToLocalTime método para obtener la hora en la zona horaria local.