Páginas

lunes, 14 de enero de 2013

Sqlite: comparar fechas en un select

Os quiero enseñar como resolví un caso en particular con las bases de datos. Concretamente quería obtener tuplas resultado de hacer un Select donde en el where propusiera una comparación de fechas (<) Tenemos dos fechas: una fecha es de tipo de dato Calendar y la otra, que se encuentra en la base de datos, es de tipo Timestamp. No podemos comparar un Calendar y un Timestamp directamente, sino que tenemos que convertirlos en un tipo de dato común. El primero que se nos puede ocurrir sería convertir ambas a tipo de dato String. Aquí podemos verlo:
Calendar fecha_ejemplo = Calendar.getInstance();

String fecha_1 = fecha_ejemplo.get(Calendar.YEAR) + "-" + 
           (fecha_fac.get(Calendar.MONTH)+1) +  "-" +
                           fecha_fac.get(Calendar.DAY_OF_MONTH);

Cursor c = myDataBase.rawQuery("SELECT _id, " +
          "strftime('%Y-%m-%d', fecha_2) AS fecha_2 " +
          "FROM TablaEjemplo " +
          "WHERE  fecha2 < " + fecha_1,
          new String[0] );   
Aquí podemos ver que la fecha tipo Calendar le hemos dado el formato establecido en el estándar ISO_8601 por medio de la función get(CAMPO) de Calendar. Por otra parte, haciendo uso de la función strftime()  también es posible hacer la conversión a string en el formato que describe el estándar citado anteriormente. Pero me pregunté si habría otra manera de hacerlo que no fuera convirtiéndolos a un tipo común como String. Investigando vi que podía hacerlo de otra manera: pasando las fechas a milisegundos

Calendar fecha_cualquiera; // pongamos que está inicializada a lo que sea.

Calendar fecha_1_milisegundos = Calendar.getInstance();
fecha_1_milisegundos.setTimeInMillis(fecha_cualquiera.getTimeInMillis());


Cursor c = myDataBase.rawQuery("SELECT _id, " +
              "(strftime('%s', fecha_2) * 1000) AS fecha_2" +
         "FROM TablaEjemplo " +
         "WHERE fecha_modificacion > " + 
         fecha_fac_milis.getTimeInMillis(), new String[0] );
En esta ocasión podemos también pasar tanto Calendar como Timestamp a un formato común en milisegundos. ¿Qué pensáis? Saludos.

1 comentario:

  1. hola Daniel! gracias por esta entrada, excelente, dejame ponerlo en práctica y te aviso quetal me va, ya hace tiempo que lo publicaste pero creo que sería una buena manera de poder comparar campos de fechas, pasa que tengo también en el SQLite almacenado el campo fecha como un String y necesito compararlo con un json que devuelve la fecha en formato long, pero esto lo convierto a cadena para poder compararlo.

    ResponderEliminar