none
Error al convertir una cadena de caracteres en fecha y/u hora RRS feed

  • Pregunta

  • Estoy conectando Netbeans con SQL para guardar una consulta con Cedula, Nombre y Fecha de Nacimiento en ese orden, desde el Netbeanaas realice la conexion perfectamente, y guarda los datos perfectamente, pero necesito mostrar los nombres que correspondan con una fecha especifica que haya ingresado el usuario y para eso utilizo SELECT * FROM Tabla WHERE YEAR(Fecha)=año, pero cuando ejecuto la instruccion desde el Netbeans me manda el siguiente mensaje : Error al convertir una cadena de caracteres en fecha y/u hora este es mi codigo en Netbeans:

                                                                                                                                       

            try

            {


                String columna[] = new String[3];
                String sentencia = "SELECT * FROM Estudiante WHERE YEAR('"+TxtFechaN.getText()+"') ="
                        + " '" +TxtAñoM.getText()+ "' " ;
                ResultSet R = ConexionBD.DevolverData(sentencia);

                while(R.next());
                {
                    columna[0] = R.getString(1);
                    columna[1] = R.getString(2);
                    columna[2] = R.getString(3);
                    M.addRow(columna);
                }
                jtTablaMostrar.setModel(M);


            }

            catch(SQLException e)

            {
                    JOptionPane.showMessageDialog(rootPane,"Error de Conexion" + "\n" + "\n" + e.getMessage());
            }



     Y este es mi query en SQL server:

    CREATE TABLE Estudiante
    (
     Cedula            INT PRIMARY KEY,
     Nombre            VARCHAR(30),
     FechaNacimiento   DATETIME

    )

     ayuda urgente por favor !

    viernes, 13 de marzo de 2015 16:02

Todas las respuestas

  • Hola Hayrom.

    Intenta convertir el parametro que envías al query a un datetime. Parece que conviertes TxtFechaN.getTex a Año y no lo haces con TxtAñoN.getText().

    Además creo que deberías de usar la columna FechaNacimiento. para poder comparar columnas de tipo datetime intenta convertirlas a datetime

    convert(datetime,'31-5-2012')

    Saludos

    viernes, 13 de marzo de 2015 16:09
  • Hola,

    Pienso que la consulta debería ser:

    String sentencia = "SELECT * FROM Estudiante WHERE YEAR(FechaNacimiento) = " + TxtAñoM.getText();

    Si la solución propuesta atendió su consulta no olvide marcarla como respuesta.

    Willams Morales
    Arequipa - PERÚ

    viernes, 13 de marzo de 2015 16:14
  •  Noberto Rojas,  no te entendi muy bien, podrias darme un ejemplo mas claro por favor, quizas modificando el codigo que coloque x favor
    • Editado Hayrom viernes, 13 de marzo de 2015 17:26
    viernes, 13 de marzo de 2015 17:22
  • William Morales, no, ya probe como me lo dijiste y me manda un error que dice: Error el conjunto de resultados no tiene la fila actual
     eso es lo que me dice si lo digito como dices tu
    • Editado Hayrom viernes, 13 de marzo de 2015 17:27
    viernes, 13 de marzo de 2015 17:23
  • Hola,

    Pero, ¿esa excepción es del tipo SqlException? ¿Podrías mencionar en que línea te marca el error? No deberías tener problemas en la consulta que te propongo

    viernes, 13 de marzo de 2015 17:30
  • Claro

    Intenta con esto:

    String sentencia = "SELECT * FROM Estudiante WHERE YEAR(FechaNacimiento) = YEAR(Convert(datetime, " +TxtAñoM.getText() + "))";

    Intenta así, o colocando las comillas simples como lo tienes. No puedo probar, así que te propongo pongas un punto de interrupción, para saber si la sentencia se arma de manera correcta, la puedes copiar y ejecutar en Sql y ver si funciona.

    viernes, 13 de marzo de 2015 17:37
  • Claro

    Intenta con esto:

    String sentencia = "SELECT * FROM Estudiante WHERE YEAR(FechaNacimiento) = YEAR(Convert(datetime, " +TxtAñoM.getText() + "))";

    Intenta así, o colocando las comillas simples como lo tienes. No puedo probar, así que te propongo pongas un punto de interrupción, para saber si la sentencia se arma de manera correcta, la puedes copiar y ejecutar en Sql y ver si funciona.

    Hola Norberto,

    Pero se entiende que el parámetro especifica un tipo de dato entero que hace referencia al año, ¿por qué "castear" a un tipo de dato fecha?

    viernes, 13 de marzo de 2015 17:42
  • Hola,

    Pero, ¿esa excepción es del tipo SqlException? ¿Podrías mencionar en que línea te marca el error? No deberías tener problemas en la consulta que te propongo

     no me manda niguna linea, me manda el mensaje nada mas, no me sale linea ni nada, solo el mensaje y en la consola dice build succesful 25 segundos
    viernes, 13 de marzo de 2015 17:46
  • Hola Willams

    Tienes razón, interprete mal y pensé que recibía una fecha. 

    Debería de funcionar con la solución que propusiste, e incluso si coloca:  = Year(" + TxtAñoM.getText() +").

    Saludos

    viernes, 13 de marzo de 2015 17:52
  • Claro

    Intenta con esto:

    String sentencia = "SELECT * FROM Estudiante WHERE YEAR(FechaNacimiento) = YEAR(Convert(datetime, " +TxtAñoM.getText() + "))";

    Intenta así, o colocando las comillas simples como lo tienes. No puedo probar, así que te propongo pongas un punto de interrupción, para saber si la sentencia se arma de manera correcta, la puedes copiar y ejecutar en Sql y ver si funciona.

    no me funciono, me volvio a mandaar el mismo error :/

    viernes, 13 de marzo de 2015 17:55
  • Hola Willams

    Tienes razón, interprete mal y pensé que recibía una fecha. 

    Debería de funcionar con la solución que propusiste, e incluso si coloca:  = Year(" + TxtAñoM.getText() +").

    Saludos

     ya la probe asi y tampoco me funciono T.T :(
    viernes, 13 de marzo de 2015 18:04
  • Ya intentaste copiar el string de sentencia y ejecutarlo en SQL para ver si funciona y donde esta el error. O pudes copiar el string que se arma en la variable sentencia.
    viernes, 13 de marzo de 2015 18:22
  • Hola Hayrom,

    Por favor, no se limite a decirnos no funciona, o sale error. Ponga puntos de interrupción, pruebe el valor de las variables, como sugiere Norberto, ejecute la sentencia en Managment Studio para ver si retorna los resultados esperados. Verifique si el método DevolverData no es donde se genera el problema. Ayúdenos si desea que lo ayudemos, su actitud no ayuda a nada y sólo dilata el tiempo sin usted recibir ninguna solución.

    viernes, 13 de marzo de 2015 18:47
  • Ya intentaste copiar el string de sentencia y ejecutarlo en SQL para ver si funciona y donde esta el error. O pudes copiar el string que se arma en la variable sentencia.

    yo coloco  la linea en sql asi SELECT *FROM Estudiante WHERE YEAR(FechaNacimiento) = txtAñoM+ y me lo ejecuta perfectamente en SQL, y el procedimiento DevolverData no es el problema dado de que es un procedimiento general que ya he usado en otros trabajos prefectamente

    CODIGO COMPLETO

       public void GuardarDatos ()
        {
           Connection miConexion;
            miConexion = ConexionBD.GetConnection();


            if (miConexion != null)
            {
                JOptionPane.showMessageDialog(null, "¡¡¡Conexion Realizada Correctamente!!!");

                boolean consulta = ConexionBD.EjecutarSentencia("INSERT INTO Estudiante VALUES" + 
                        "('" +TxtCedula.getText()+ "', '" +TxtNombre.getText()+"' ,  '"+TxtFechaN.getText()+"')");



            }
            else
            {
                JOptionPane.showMessageDialog(null,"Error");
            }
        }

        public void TFormato(){

           String Titulos[] = {"Cedula", "Nombre", "Fecha"};
           M = new DefaultTableModel(null, Titulos);
           jtTablaMostrar.setModel(M);




        }



        public void MostrarPorAño ()
        {


            try

            {


                String columna[] = new String[3];
                String sentencia =   "SELECT * FROM Estudiante WHERE YEAR('"+TxtFechaN.getText()+"') ="
                        + " '" +TxtAñoM.getText()+ "' " ;
                ResultSet R = ConexionBD.DevolverData(sentencia);

                while(R.next());
                {
                    columna[0] = R.getString(1);
                    columna[1] = R.getString(2);
                    columna[2] = R.getString(3);
                    M.addRow(columna);
                }
                jtTablaMostrar.setModel(M);


            }

            catch(SQLException e)

            {
                    JOptionPane.showMessageDialog(rootPane,"Error de Conexion" + "\n" + "\n" + e.getMessage());
            }




    CODIGO DevolverData:

    public class ConexionBD {
         //Atribuutos!
        static Connection Conexion = null;
        
        
        //Crear Conexion a Base de Datos
        public static Connection GetConnection()
        {
            
            try{ 
                
                Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
                String url = "jdbc:sqlserver://NEIDENNX-PC;databaseName=Proyecto1Progra2;user=Proyecto1;password=sa;";
                
                if ((Conexion == null) || (Conexion.isClosed()))
                {
                    Conexion = DriverManager.getConnection(url);
                }
                
            }
            catch(SQLException ex)
            {
                JOptionPane.showMessageDialog(null, ex, "Error en la Conexion con la Base de Datos"
                + ex.getMessage(), JOptionPane.ERROR_MESSAGE);
                
                Conexion = null;
            }
            finally
            {
                return Conexion;
            }
        }
        
        public static boolean EjecutarSentencia(String sentencia)
        {
            
            Connection miConexion = (Connection) ConexionBD.GetConnection();
            boolean returnValue = false;
                    try
                    {
                     Statement statement = (Statement) miConexion.createStatement();
                     returnValue = statement.execute(sentencia);
                      JOptionPane.showMessageDialog(null, "Operación con éxito");
                     statement.close();
                     miConexion.close();
                   
                    }catch(Exception ex)
                    {
                        JOptionPane.showMessageDialog(null,"ERROR!!!" + ex.getMessage());
                        
                    }
                    return returnValue;
        }
        
        public static ResultSet DevolverData(String sentencia)
        {
            Connection miConexion = (Connection) ConexionBD.GetConnection();
            ResultSet returnValue = null;
            
            
            try
            {
            Statement statement = (Statement) miConexion.createStatement();
            returnValue = statement.executeQuery(sentencia);
            
            }catch(Exception ex)
            {
                JOptionPane.showMessageDialog(null,"ERROR!!!" + ex.getMessage());
            }
              return returnValue;
           }        
        }
        
            
            

                                                                                                                                                                                                                                                                                                    
    viernes, 13 de marzo de 2015 20:18
  • Hola,

    String sentencia =   "SELECT * FROM Estudiante WHERE YEAR('"+TxtFechaN.getText()+"') ="
                        + " '" +TxtAñoM.getText()+ "' " ;

    Una vez más, ¿por qué pasas como parámetro el valor de TxtFechaN.getText() a la función YEAR?. ¿No deberías evaluar el año según los valores de la columna FechaNacimiento?

    String sentencia =   "SELECT * FROM Estudiante WHERE YEAR(FechaNacimiento) = " + TxtAñoM.getText();

    El error que describes: "Error al convertir una cadena de caracteres en fecha y/u hora", se produce porque estás enviando un valor no permitido en el parámetro TxtFechaN.getText(), que de por si te mencioné que no es correcto hacer ello.


    viernes, 13 de marzo de 2015 20:38
  • Hola,

    String sentencia =   "SELECT * FROM Estudiante WHERE YEAR('"+TxtFechaN.getText()+"') ="
                        + " '" +TxtAñoM.getText()+ "' " ;

    Una vez más, ¿por qué pasas como parámetro el valor de TxtFechaN.getText() a la función YEAR?. ¿No deberías evaluar el año según los valores de la columna FechaNacimiento?

    String sentencia =   "SELECT * FROM Estudiante WHERE YEAR(FechaNacimiento) = " + TxtAñoM.getText();

    El error que describes: "Error al convertir una cadena de caracteres en fecha y/u hora", se produce porque estás enviando un valor no permitido en el parámetro TxtFechaN.getText(), que de por si te mencioné que no es correcto hacer ello.

    TxtFechaN.getText() es el textfield en en cual el usuario ingresa los valores que se guardan en la columna FechaNacimiento, como ya habia dicho, si en vez de colocar el TxtFechaN  colocara FechaNacimiento me manda otro error

    viernes, 13 de marzo de 2015 20:50
  • Hola de nuevo.

    Si funciona en SQL y en el código no, por favor intenta pasar los valores por parametros, NO concatenandolos con string.

    El objeto stantement debe permitir agregar parametros, defines su tipo y vemos como se comporata.

    en SqlCommand es algo siminar a esto:

    command.CommandType = CommandType.Text;
    
    command.Parameters.Add(new Parameter("@FechaNacimiento", TxtFecha.getText(), DbType.DateTime);
    
    command.Parameters.Add(new Parameter("@Año", TxtAñoM.getText(), DbType.Int);



    y en el Texto sería mas o menos así:

    commmad.CommandText = "SELECT * FROM Estudiantes where YEAR(@FechaNacimiento) = @AÑO";

    La sintaxis puede no estar correcta, y seguramente en tu caso es diferente pero intenta, si ya identificamos que el query no es el problema (por lo que comentas que en sql se ejecuta bien), revisemos si son los valores que se le envian.

    Saludos


    viernes, 13 de marzo de 2015 21:48
  • Hola de nuevo.

    Si funciona en SQL y en el código no, por favor intenta pasar los valores por parametros, NO concatenandolos con string.

    El objeto stantement debe permitir agregar parametros, defines su tipo y vemos como se comporata.

    en SqlCommand es algo siminar a esto:

    command.CommandType = CommandType.Text;
    
    command.Parameters.Add(new Parameter("@FechaNacimiento", TxtFecha.getText(), DbType.DateTime);
    
    command.Parameters.Add(new Parameter("@Año", TxtAñoM.getText(), DbType.Int);



    y en el Texto sería mas o menos así:

    commmad.CommandText = "SELECT * FROM Estudiantes where YEAR(@FechaNacimiento) = @AÑO";

    La sintaxis puede no estar correcta, y seguramente en tu caso es diferente pero intenta, si ya identificamos que el query no es el problema (por lo que comentas que en sql se ejecuta bien), revisemos si son los valores que se le envian.

    Saludos


    disculpa es que no entiendo en donde dices que tengo que digitar esas lineas, si me puedes ser mas especifico te lo agradeceria
    sábado, 14 de marzo de 2015 2:47
  • Nadie me puede responder? por favor de verdad necesito ayuda
    sábado, 14 de marzo de 2015 20:59
  • Hola Hayrom,

    El problema que presentas al parecer es fácil de resolver, lo que sucede es que no das mayores detalles.

    Una vez más, empecemos de nuevo. Por favor, se puntual es tu respuesta:

    ¿Hay inconveniente en que la consulta sea así:?

    String sentencia =   "SELECT * FROM Estudiante WHERE YEAR(FechaNacimiento) = " + TxtAñoM.getText();

    De no haber inconveniente, que error te sale. Crea puntos de interrupción y menciona en que línea te salta el error.

    sábado, 14 de marzo de 2015 21:31
  • Hola Hayrom,

    El problema que presentas al parecer es fácil de resolver, lo que sucede es que no das mayores detalles.

    Una vez más, empecemos de nuevo. Por favor, se puntual es tu respuesta:

    ¿Hay inconveniente en que la consulta sea así:?

    String sentencia =   "SELECT * FROM Estudiante WHERE YEAR(FechaNacimiento) = " + TxtAñoM.getText();

    De no haber inconveniente, que error te sale. Crea puntos de interrupción y menciona en que línea te salta el error.

    Si lo hago asi, me manda un error que dice: "Error el conjunto de resultados no tiene la fila actual"
    y en cuanto a la linea en la que me manda el error, no se cual es se me puedes decir como hacer para ver que linea es el error tambien te lo agradeceria dado el hecho de que soy estudiante y mis profesores no me han enseñado a hacer eso

    sábado, 14 de marzo de 2015 21:48
  • Ya  aprendi como hacerlo, pero no se definir cual es la linea que manda error, como puedo identificarla?

    sábado, 14 de marzo de 2015 22:04
  • nadie ? .-.
    sábado, 14 de marzo de 2015 23:17
  • Hola,

    Ejecuta lo siguiente en Managment Studio

    SELECT * FROM Estudiante WHERE YEAR(FechaNacimiento) = 2014;

    ¿Te devuelve valores? Imagino que si. En todo caso, en vez de 2014 coloca un año para el que tengas registros.

    Si te devuelve resultados, pon un punto de interrupción en la línea 

    String sentencia =   "SELECT * FROM Estudiante WHERE YEAR(FechaNacimiento) = " + TxtAñoM.getText();

    y coméntanos que valor tiene el control TxtAñoM.getText(), ¿debería ser un año verdad?

    sábado, 14 de marzo de 2015 23:54
  • Hola,

    Ejecuta lo siguiente en Managment Studio

    SELECT * FROM Estudiante WHERE YEAR(FechaNacimiento) = 2014;

    ¿Te devuelve valores? Imagino que si. En todo caso, en vez de 2014 coloca un año para el que tengas registros.

    Si te devuelve resultados, pon un punto de interrupción en la línea 

    String sentencia =   "SELECT * FROM Estudiante WHERE YEAR(FechaNacimiento) = " + TxtAñoM.getText();

    y coméntanos que valor tiene el control TxtAñoM.getText(), ¿debería ser un año verdad?

    SELECT * FROM Estudiante WHERE YEAR(FechaNacimiento) = 2014;

    supongo que el año deberia de ir '"+2014+"' o no?


    domingo, 15 de marzo de 2015 0:28
  • Hola,

    No, el año es un valor numérico, no requieres de delimitarlo entre comillas simples. La prueba que te pedí que hagas es en Managment Studio de SQL Server para ver si te devolvía registros

    Por otro lado te pedí que pongas un punto de interrupción y que nos indiques que valor devuelve TxtAñoM.getText(),

    domingo, 15 de marzo de 2015 0:33
  • Hola,

    No, el año es un valor numérico, no requieres de delimitarlo entre comillas simples. La prueba que te pedí que hagas es en Managment Studio de SQL Server para ver si te devolvía registros

    Por otro lado te pedí que pongas un punto de interrupción y que nos indiques que valor devuelve TxtAñoM.getText(),

     ah ok, en SQL si me devuelve la tabla con resutados, el break point tengo que colocarlo en la linea:

    SELECT * FROM Estudiante WHERE YEAR(FechaNacimiento) = '"+TxtAñoM.gettext()+"';

    al colocar el break point en esa linea me sale el valor '1998'

    domingo, 15 de marzo de 2015 1:07
  • Ok,

    "SELECT * FROM Estudiante WHERE YEAR(FechaNacimiento) = " + TxtAñoM.gettext();

    Es correcto, reitero que no es necesario la comilla simple. De seguro que si tiras la consulta en SQL Managmet Studio obtienes resultados.

    SELECT * FROM Estudiante WHERE YEAR(FechaNacimiento) = 1998;
    Con ello estaríamos validando que le problema no es la consulta. Pon un punto de interrupción en la sentencia while(R.next()) para ver si llega ahí sin errores.

    domingo, 15 de marzo de 2015 1:17
  • Ok,

    "SELECT * FROM Estudiante WHERE YEAR(FechaNacimiento) = " + TxtAñoM.gettext();

    Es correcto, reitero que no es necesario la comilla simple. De seguro que si tiras la consulta en SQL Managmet Studio obtienes resultados.

    SELECT * FROM Estudiante WHERE YEAR(FechaNacimiento) = 1998;
    Con ello estaríamos validando que le problema no es la consulta. Pon un punto de interrupción en la sentencia while(R.next()) para ver si llega ahí sin errores.

    ok pero al colocarle el breaekpoint y debuggearlo, como reconozco si tiene un error o no?
    domingo, 15 de marzo de 2015 1:20
  • Si antes de llegar al punto de interrupción te marca error es que la excepción está en algún método anterior al que marcaste. Puedes también poner el punto de interrupción al inicio y a partir de ahi presionar F11 para ir paso a paso por las instrucciones hasta que te salte el error.
    domingo, 15 de marzo de 2015 1:27
  • Si antes de llegar al punto de interrupción te marca error es que la excepción está en algún método anterior al que marcaste. Puedes también poner el punto de interrupción al inicio y a partir de ahi presionar F11 para ir paso a paso por las instrucciones hasta que te salte el error.

    Ok Coloque el breakpoint  en el (R.next()) que me dijiste y al debuggearlo no me pasa de ahi, se queda trabado y por mas que le doy F8 ( resulta seer que es F8 y no F7 jeje) no avanza de ahi el debug se queda ahi y no avanza nada, parece como si cada vez que le doy F8 cargara todo el proceso hasta el (R.next()) que quiere decir eso?

    domingo, 15 de marzo de 2015 3:04
  • R.Next itera entre el conjunto de resultados que devuelve la consulta. Entrará en un ciclo tantas veces hayas registros resultantes en la consulta. Si no te marca ningún error hasta ahí todo esta bien. Quizá el problema está en  jtTablaMostrar.setModel(M);
    domingo, 15 de marzo de 2015 3:19
  • R.Next itera entre el conjunto de resultados que devuelve la consulta. Entrará en un ciclo tantas veces hayas registros resultantes en la consulta. Si no te marca ningún error hasta ahí todo esta bien. Quizá el problema está en  jtTablaMostrar.setModel(M);

    ok

       while(R.next());
                {
                    columna[0] = R.getString(1); <---- cuando el debug llega  hasta aca se salta todo lo que sigue
                    columna[1] = R.getString(2); <---- esto se lo salta
                    columna[2] = R.getString(3); <---- esto tambien
                    M.addRow(columna);
                }
                jtTablaMostrar.setModel(M);        <---- tambien esto
                
                
            }
            
            catch(SQLException e)  <---- y cae directamente en la exepcion de SQL y me manda el mensaje de "Error el                                                          conjunto de resultados no tiene la fila."
          
            {
                    JOptionPane.showMessageDialog(rootPane,"Error de Conexion" + "\n" + "\n" + e.getMessage());
            }
                        


    • Editado Hayrom domingo, 15 de marzo de 2015 20:24
    domingo, 15 de marzo de 2015 3:51
  • En la Debugger Console me sale esto:

    Listening on javadebug
    User program running
    LineBreakpoint IngresoDatos.java : 303 successfully submitted.
    MethodBreakpoint [proyecto1progra2.IngresoDatos].MostrarPorAño '()V' successfully submitted.
    MethodBreakpoint [proyecto1progra2.IngresoDatos].MostrarPorAño '()V' successfully submitted.
    Method breakpoint hit in proyecto1progra2.IngresoDatos.MostrarPorAño at line 292 by thread AWT-EventQueue-0.
    Method breakpoint hit in proyecto1progra2.IngresoDatos.MostrarPorAño at line 292 by thread AWT-EventQueue-0.
    Thread AWT-EventQueue-0 stopped at IngresoDatos.java:292.
    User program running
    Thread AWT-EventQueue-0 stopped at IngresoDatos.java:293.
    User program running
    Thread AWT-EventQueue-0 stopped at IngresoDatos.java:294.
    User program running
    Thread AWT-EventQueue-0 stopped at IngresoDatos.java:296.
    User program running
    Thread AWT-EventQueue-0 stopped at IngresoDatos.java:298.
    User program running
    Thread AWT-EventQueue-0 stopped at IngresoDatos.java:311.
    User program running
    Thread AWT-EventQueue-0 stopped at IngresoDatos.java:234.
    User program running
    LineBreakpoint IngresoDatos.java : 292 successfully submitted.

    domingo, 15 de marzo de 2015 20:25
  • Supongo que alguna de esas lineas es la que manda el error o no ?

    domingo, 15 de marzo de 2015 22:23