functions ejemplo current 11g sql oracle oracle10g where-clause date-arithmetic

sql - current - timestamp oracle ejemplo



Fecha de Oracle "entre" consulta (5)

A juzgar por su resultado, parece que definió START_DATE como una marca de tiempo. Si fuera una fecha regular, Oracle podría manejar la conversión implícita. Pero como no es necesario, debes convertir explícitamente esas cadenas para que sean fechas.

SQL> alter session set nls_date_format = ''dd-mon-yyyy hh24:mi:ss'' 2 / Session altered. SQL> SQL> select * from t23 2 where start_date between ''15-JAN-10'' and ''17-JAN-10'' 3 / no rows selected SQL> select * from t23 2 where start_date between to_date(''15-JAN-10'') and to_date(''17-JAN-10'') 3 / WIDGET START_DATE ------------------------------ ---------------------- Small Widget 15-JAN-10 04.25.32.000 SQL>

Pero solo tenemos una fila. Esto es porque START_DATE tiene un elemento de tiempo. Si no especificamos el componente de tiempo, Oracle lo predetermina a la medianoche. Eso está bien para el lado del lado BETWEEN pero no para el lado hasta :

SQL> select * from t23 2 where start_date between to_date(''15-JAN-10'') 3 and to_date(''17-JAN-10 23:59:59'') 4 / WIDGET START_DATE ------------------------------ ---------------------- Small Widget 15-JAN-10 04.25.32.000 Product 1 17-JAN-10 04.31.32.000 SQL>

editar

Si no puede pasar el componente de tiempo, hay un par de opciones. Una es cambiar la cláusula WHERE para eliminar el elemento de tiempo de los criterios:

where trunc(start_date) between to_date(''15-JAN-10'') and to_date(''17-JAN-10'')

Esto podría tener un impacto en el rendimiento, ya que descalifica cualquier índice de b-tree el START_DATE. En su lugar, necesitaría construir un índice basado en funciones.

Alternativamente, puede agregar el elemento de tiempo a la fecha en su código:

where start_date between to_date(''15-JAN-10'') and to_date(''17-JAN-10'') + (86399/86400)

Debido a estos problemas, muchas personas prefieren evitar el uso de between al comprobar los límites de fecha como esta:

where start_date >= to_date(''15-JAN-10'') and start_date < to_date(''18-JAN-10'')

Estoy usando la base de datos Oracle. Quiero ejecutar una consulta para verificar los datos entre dos fechas.

NAME START_DATE ------------- ------------- Small Widget 15-JAN-10 04.25.32.000000 PM Product 1 17-JAN-10 04.31.32.000000 PM select * from <TABLENAME> where start_date BETWEEN ''15-JAN-10'' AND ''17-JAN-10''

Pero no obtengo ningún resultado de la consulta anterior. Creo que tengo que usar "me gusta" y "%". Pero no sé dónde usarlos. Por favor, arroja algunas luces sobre esto.

gracias por adelantado.


Como apuntó acertadamente APC, su columna start_date parece ser TIMESTAMP pero también podría ser TIMESTAMP WITH LOCAL TIMEZONE o TIMESTAMP WITH TIMEZONE datatype. Esto bien podría influir en cualquier consulta que estuvieras haciendo sobre los datos si tu servidor de base de datos estuviera en una zona horaria diferente a ti. Sin embargo, vamos a mantener esto simple y supongamos que está en la misma zona horaria que su servidor. Primero, para darle confianza, verifique que start_date sea un tipo de datos TIMESTAMP.

Use el comando SQLPlus DESCRIBE (o el equivalente en su IDE) para verificar que esta columna sea un tipo de datos TIMESTAMP.

p.ej

DESCRIBIR mytable

Debería informar:

Name Null? Type ----------- ----- ------------ NAME VARHAR2(20) START_DATE TIMESTAMP

Si se informa como un tipo = TIMESTAMP, puede consultar los intervalos de fechas con la conversión de fecha TO_TIMESTAMP más simple, que no requiere argumento (o imagen).

Usamos TO_TIMESTAMP para garantizar que cualquier índice en la columna START_DATE sea considerado por el optimizador. La respuesta de APC también señaló que se podría haber creado un índice basado en función en esta columna y que influiría en el predicado de SQL, pero no podemos comentar eso en esta consulta. Si desea saber cómo averiguar qué índices se han aplicado a la tabla, publique otra pregunta y podemos responder por separado.

Entonces, suponiendo que hay un índice en start_date, que es un tipo de datos TIMESTAMP y quieres que el optimizador lo considere, tu SQL sería:

select * from mytable where start_date between to_timestamp(''15-JAN-10'') AND to_timestamp(''17-JAN-10'')+.9999999

+999999999 está muy cerca, pero no es exactamente 1, por lo que la conversión de 17-JAN-10 será lo más cercana posible a la medianoche de ese día, por lo tanto, la consulta devuelve ambas filas.

La base de datos verá ENTRE a partir del 15-JAN-10 00: 00: 00: 0000000 a 17-JAN-10 23: 59: 59: 99999 y por lo tanto incluirá todas las fechas del 15, 16 y 17 de enero de 2010 sea cual sea el tiempo componente de la marca de tiempo.

Espero que ayude.

Dazzer


Debe convertirlos en fechas reales en lugar de cadenas, intente esto:

SELECT * FROM <TABLENAME> WHERE start_date BETWEEN TO_DATE(''2010-01-15'',''YYYY-MM-DD'') AND TO_DATE(''2010-01-17'', ''YYYY-MM-DD'');

Editado para tratar el formato como se especifica:

SELECT * FROM <TABLENAME> WHERE start_date BETWEEN TO_DATE(''15-JAN-10'',''DD-MON-YY'') AND TO_DATE(''17-JAN-10'',''DD-MON-YY'');


Fecha entre consulta

SELECT * FROM emp WHERE HIREDATE between to_date (to_char(sysdate, ''yyyy'') ||''/09/01'', ''yyyy/mm/dd'') AND to_date (to_char(sysdate, ''yyyy'') + 1|| ''/08/31'', ''yyyy/mm/dd'');


La siguiente consulta también se puede usar:

select * from t23 where trunc(start_date) between trunc(to_date(''01/15/2010'',''mm/dd/yyyy'')) and trunc(to_date(''01/17/2010'',''mm/dd/yyyy''))