Publicado el Dejar un comentario

Cómo obtener cuántos días hay entre dos fechas en Oracle.

Para obtener los días entre dos fechas a través de una sentencia Sql en Oracle podemos usar sencillamente la aritmética de tipos DATE (fecha) de esta base de datos. Para hacer esta operación los operandos deben ser de tipo DATE (fecha).

Supongamos que tenemos dos columnas o campos llamados START_DATE y END_DATE, ambos de tipo DATE, en una tabla llamada JOB_HISTORY. Para obtener los días entre dichas fechas utilizaríamos algo así:

SELECT 
    end_date, start_date, end_date - start_date as dias
FROM 
    job_history;

Simplemente restamos de la fecha mayo o más actual (en este caso end_date) la fecha menor o más antigua (start_date) usando le palabra reservada o símbolo de menos ( – ). El resultado sería algo así:

Hay que tomar en cuenta que en esta operación Oracle toma como comienzo de la fecha la hora cero de día, es decir que no incluye el día final. Por ejemplo, supongamos que queremos obtener los días que hay entre el primero de enero del año dos mil y el 31 de enero de ese mismo año, la consulta sql sería:

select 
    TO_DATE('31/01/2000','DD/MM/YYYY') - TO_DATE('01/01/2000','DD/MM/YYYY') as dias
from dual;

La ejecución de esta consulta nos daría como resultado 30 días y no 31 como algunos esperaríamos. La solución sería añadir 1 a la operación:

select 
    (TO_DATE('31/01/2000','DD/MM/YYYY') - TO_DATE('01/01/2000','DD/MM/YYYY')) + 1 as dias
from dual;

Espero y les sirva este entrada o post. ¡Hasta la próxima!

Publicado el Dejar un comentario

Sql Developer: Cómo cargar todos los registros resultantes de una consulta SQL.

Por defecto y debido a cuestiones de rendimiento, SQL Developer de Oracle, sólo muestra 200 filas en el área de resultados después de ejecutar una consulta SQL. A medida que avanzamos con la barra de desplazamiento, va mostrando los resultados en conjuntos de 200 filas hasta llegar al fin.

SQL Developer no muestra todos los resultados de una sola vez, como a veces lo necesitamos. El estar desplazándonos por la barra de desplazamiento de la ventana de resultados es tardado y tedioso. Sin embargo, existe un pequeño truco para hacer que muestre los resultados completos una vez que hayamos  ejecutado la consulta SQL y nos muestre los primeros registros:

Nos ubicarnos en la ventana o área de resultados de la consulta y oprimimos las teclas Ctrl-Fin al mismo tiempo.

Esto nos llevará al última fila de la consulta y por ende cargará todas las filas de la consulta. La próxima vez que quieras que SQL Developer muestra todas las filas resultantes, aplica este truco.

¡Saludos!

Publicado el Dejar un comentario

Numerar por grupos los resultados de una consulta SQL en Oracle

En el post pasado vimos como numerar los resultados de una consulta desde 1 a el total de registros devueltos por la consulta con la función ROW_NUMBER(). Ahora queremos que numere desde 1  hasta el número de registros que exista en cada grupo distinto de datos que regrese la consulta. Para ejemplificar usaremos la consulta siguiente a la tabla EMPLOYEES:

SELECT 
    ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY last_name) AS numero_consecutivo,
    department_id,
    last_name 
FROM 
    employees;

PARTITION BY le indica a la función ROW_NUMBER(), que va a numerar a partir de 1 por cada grupo de registro con diferente valor en el campo DEPARTMENT_ID.  ORDER BY le indica que va a numerar los registros de cada grupo de acuerdo al orden ascendente del valor del campo LAST_NAME

Veamos el fragmento del resultado que daría la consulta SQL anterior para entender mejor el funcionamiento:

Como vemos en el resultado, la numeración (columna NUMERO_CONSECUTIVO en el resultado) reinicia con 1 por cada valor de DEPARTMENT_ID distinto y los numera de acuerdo al orden del valor LAST_NAME: en el DEPARTMENT_ID “10” sólo existe 1 empleado y tiene el valor de “Whalen” en el campo LAST_NAME. En el DEPARTMENT_ID “20” existen 2 empleados con los valores “Fay” y “Hartstein” y los numeró de acuerdo al orden alfabético, a “Fay” le dió el NUMERO_CONSECUTIVO “1” y a “Hartstein” el 2. En el DEPARTMENT_ID “30” hay 6 empleados y los numeró del 1 al 6 de acuerdo al orden alfabético de LAST_NAME y así sucesivamente con el resto de los empleados.

Si existiera una clausula ORDER BY en la sentencia, el orden del despliegue de salida  sería por los campos indicados en dicha cláusula.

¿Dudas? ¿Preguntas? Deja tus comentarios. ¡Hasta la próxima!