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.

jueves, 3 de enero de 2013

Las gracias del Windows 8

El otro día, haciendo una vista general de mi ordenador portátil, decidí que ya era hora de hacerle un "borrón y cuenta nueva", que al fin de al cabo, el nuevo año acaba de comenzar. Entonces vi que mi Windows 7 iba demasiado lento (normal supongo... no es que tampoco lo utilizara mucho) y ,por otra parte, mi Linux Mint 13 (Maya) que me recomendaron probar estaba resultando demasiado problemático y no es que me gustara demasiado. Se acabó.


Con la salida del nuevo sistema operativo de Microsoft, el Windows 8 (que lo estoy probando haber que tal me va, y si va bien la cosa, probablemente me lo compre, está a un precio más que asequible) , y con un CD-R con etiqueta Ubuntu 12.04 LTS (distribución GNU/Linux) que me grabé ayer, me dispuse a hacer un cambio radical a mi ordenador.

Consejo: haced una copia de seguridad de vuestros datos que sean relevantes, por vuestro bien. Parece un consejo muy obvio, pero que esa copia de seguridad la pongáis en cualquier lugar menos dentro de vuestro disco duro, que es el que vais a toquetear. Yo utilicé SkyDrive de Microsoft pero buenamente también podría haber utilizado DropBox, los dos son gratuitos.

Una vez hecho esto, un amigo mío(que es to buena gente y me dejó el Windows 8 en la versión de prueba de 30 días) y yo nos disponemos a hacer la instalación de Windows 8. Aprovecho la particion que tengo de Windows 7 (NTFS) para instalar el sistema junto con otra partición que hacemos (también en NTFS) para datos en general. La instalación es todo un éxito, la cosa va bien y ahora sólo queda instalar el Ubuntu. Por supuesto también aprovechando las particiones que ya tenía hechas con el Mint. Pero.... ¡¡¡¡ sorpresa !!!!. En la instalación de Ubuntu, cuando estaba por el paso de seleccionar dónde quería instalarlo (Gparted) me decía "unallocated space", es decir, que no reconoce lo que hay ahí.... ¡¡ En la instalación de windows 8 me había toqueteado la tabla de particiones !!! ¿pero qué coño...?

Total, me puse a investigar un poco, haber como podía solucionar la papeleta y....

1. Re-escribí la tabla de particiones que analice con TestDisk. Haciendo esto supuestamente ya volvería todo a la normalidad.

2. Pues no! Ahora estás más puteado que antes! guay!. Gparted ahora no me reconocía absolutamente NADA. Todo el espacio del disco era "unallocated disc" por lo que me puse manos a la obra para ver qué había pasado (otra vez).

3. Despues de estar toda la mañana de ayer buscando una solución, encontre (como era de esperar) a alguien en el mundo (a varios) que le habían pasado algo como yo y... viendo el foro... vi que la partición extendida sobrepasaba el tamaño del disco... capacidad de todas las particiones > capacidad disco (????) ¿cómo ha pasado esto? Ni idea... pero ha tenido que ser el Windows 8 seguro. Total, que lo que hago es un redireccionado de la partición extendida para que no exceda el tamaño del disco. Lo he hecho con fdisk. He intentado poner el ultimo sector del disco a esta partición pero no me dejaba.. asi que he tenido que dejar 1 sector del disco inutilizado (unos 10 MiB - en fin... no hay beneficio sin sacrificio). Y todo arreglado.. ahora Gparted me reconoce las particiones y voy a instalar ubuntu desde ya...


Hoy por hoy, estoy muy satisfecho de lo que hice, esa sensación de hacer el trabajo bien hecho (o medio bien) y.. parece que tengo un ordenador totalmente diferente.

En fin, mi primera entrada al blog, haber si la próxima le añado fotitos o algo para que esté más mona.

Saludos.