|
SQL - INTERVAL (Intervalos de fecha) |
|
|
Supongamos que estás creando un JOB y tienes que indicar un intervalo de repetición de 30 segundos ... tal vez estás pensando en una expresión como "sysdate + 30/86400"; pero ya desde Oracle 9i se podría usar la expresión "INTERVAL '30' SECOND", que además es mucho más intuitiva y fácil de leer.
Esta expresión es posible porque, desde Oracle 9i, existe un nuevo tipo de dato (INTERVAL) que permite expresar intervalos de tiempo. Realmente son dos nuevos tipos (INTERVAL YEAR TO MONTH e INTERVAL DAY TO SECOND), que permiten expresar intervalos de años (como "3 años y 5 meses") y de días (como "5 días, 10 horas, 30 minutos y 22'345 segundos"). En el siguiente ejemplo, los 4 primeros casos son intervalos de días (DAY TO SECOND) y los 2 últimos de años (YEAR TO MONTH):
SQL> select INTERVAL '70.005' SECOND from dual;
INTERVAL'30'SECOND
---------------------------------------------------------------------------
+00 00:01:10.005000
SQL> select INTERVAL '130' minute from dual;
INTERVAL'30'MINUTE
---------------------------------------------------------------------------
+00 02:10:00
SQL> select INTERVAL '25' hour from dual;
INTERVAL'25'HOUR
---------------------------------------------------------------------------
+01 01:00:00
SQL> select INTERVAL '30' day from dual:
INTERVAL'30'DAY
---------------------------------------------------------------------------
+30 00:00:00
SQL> select INTERVAL '30' month from dual;
INTERVAL'30'MONTH
---------------------------------------------------------------------------
+02-06
SQL> select INTERVAL '30' year from dual;
INTERVAL'30'YEAR
---------------------------------------------------------------------------
+30-00
Como podemos observar, la expresión "INTERVAL '25' HOUR" la "traduce" como "1 día y 1 hora", y la expresión "INTERVAL '30' MONTH" como "2 años y 6 meses".
También podemos restar (o sumar) un intervalo a una fecha. En este lo recomendable sería usar tipo TIMESTAMP (ver referencias), y no DATE:
SQL> SELECT SYSTIMESTAMP, SYSTIMESTAMP - INTERVAL '20' MINUTE FROM DUAL SYSTIMESTAMP --------------------------------------------------------------------------- SYSTIMESTAMP-INTERVAL'20'MINUTE --------------------------------------------------------------------------- 06-OCT-10 11.24.45.516813 AM +02:00 06-OCT-10 11.04.45.516813000 AM +02:00 SQL> select to_char(sysdate,'dd-mm-yyyy hh24:mi:ss'), to_char(sysdate - INTERVAL '20' MINUTE,'dd-mm-yyyy hh24:mi:ss') from dual; TO_CHAR(SYSDATE,'DD TO_CHAR(SYSDATE-INT ------------------- ------------------- 06-10-2010 11:29:00 06-10-2010 11:09:00
Referencias:
|
|
Última modificación ( 06.10.2010 )
|