Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

conversion fechas

Estas en el tema de conversion fechas en el foro de Oracle en Foros del Web. Buenas...tengo un problema y no se como resolverlo... al sacar un campo fecha de una base de datos oracle por php el campo me sale ...
  #1 (permalink)  
Antiguo 12/04/2011, 06:24
 
Fecha de Ingreso: enero-2009
Mensajes: 32
Antigüedad: 15 años, 2 meses
Puntos: 0
conversion fechas

Buenas...tengo un problema y no se como resolverlo...

al sacar un campo fecha de una base de datos oracle por php el campo me sale en el siguiente formato, sin tocar nada

por ejemplo

2011-04-11 12:04:24
2011-04-11 12:05:16
2011-04-11 12:07:10

lo que queria es ponerlo en formato dd/mm/yyyy por ejemplo y poner pasarle dos fechas y seleccionar las que correspondan a esas dos fechas

Select * from tabla where fecha Between varia1 and varia2;
Select * from tabla where fecha > varia and fecha < varia2;

pero al intentar formatearlo con TO_DATE (fecha, 'dd/mm/yyyy')


Me sale 2011-04.11 00:00:00 osea, ni puñetero caso

Si lo hago con TO_CHAR (fecha, 'dd/mm/yyyy') si que me lo deja bien pero no puedo comprar entre dos strings con < > =

y necesitaria ayuda porque no encuentro nada por ningun lado
  #2 (permalink)  
Antiguo 12/04/2011, 07:59
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: conversion fechas

Definitivamente es con TO_DATE.
Pero lo estas usando mal.

Muestranos en un ejemplo claro que es lo que pasa y como haces uso de la función TO_DATE.

saluods
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 12/04/2011, 08:05
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: conversion fechas

Hola PabloJN:

Según recuerdo TO_DATE() recibe como parámetro UNA CADENA, no una fecha. Para obtener una fecha con el formato que quieres tienes que hacer lo siquiente:

Código:
to_date(to_char(sysdate, 'dd/mm/yyyy'), 'dd/mm/yyyy')
es decir, con la función TO_CHAR() obtienes una CADENA con el formato especificado. Esta cadena resultante la envías como parámetro a la función TO_DATE(), especificando el mismo formato.

Como recomendación, cuando trabajes con rangos de fechas no utilices BETWEEN, es mejor especificar los rangos de manera explícita.

Código SQL:
Ver original
  1. SELECT * FROM tabla
  2. WHERE
  3. to_date(to_char(fecha, 'dd/mm/yyyy'), 'dd/mm/yyyy') >=  
  4. to_date(to_char(varia, 'dd/mm/yyyy'), 'dd/mm/yyyy')
  5. AND
  6. to_date(to_char(fecha, 'dd/mm/yyyy'), 'dd/mm/yyyy') <=  
  7. to_date(to_char(varia2, 'dd/mm/yyyy'), 'dd/mm/yyyy')



Ten cuidado en el operador relacional que utilizas (<, <=, >, >=) para especificar los límites de tus rangos.

Saludos
Leo.
  #4 (permalink)  
Antiguo 12/04/2011, 08:14
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: conversion fechas

leonardo...
pero ahí no se estaría haciendo una conversión innecesaria?

Para hacer comparaciones, a oracle no le importa cual sea el formato de la fecha. El las hace perfectamente. Si se quiere mostrar un formato de fecha personalizado es muy util la función to_char.
Si se quiere hacer comapraciones y operaciones con fechas basados en una fecha personalizada (osea string) se utiliza to_date.

Hacer to_date(to_char(fecha,'formato'),'formato') es equivalente a hacer fecha
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 12/04/2011, 09:06
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: conversion fechas

Hola Huesos52:

Cita:
Hacer to_date(to_char(fecha,'formato'),'formato') es equivalente a hacer fecha
Hay una pequeña pero a la vez gran diferencia al hacer este tipo de conversiones pues al parecer no tomas en cuenta que los campos tipo fecha TAMBIÉN ALMACENAN LA HORA. Supongamos que queremos obtener la diferencia en días entre el 04 de abril de 2011 hasta el día de hoy. Según tu razonamiento sería algo como esto:

Código SQL:
Ver original
  1. SELECT sysdate - to_date('04/04/2011', 'DD/MM/YYYY') dias_de_diferencia FROM dual;

Código:
dias_de_diferencia
----------------------------
8.41927083333333333333333333333333333333
Este resultado es perfectamente correcto, es decir, no hay nada de malo en el cálculo, pero si haces lo siguiente

Código SQL:
Ver original
  1. SELECT to_date(to_char(sysdate, 'DD/MM/YYYY'), 'DD/MM/YYYY') - to_date('04/04/2011', 'DD/MM/YYYY') dias_de_diferencia FROM dual;

El resultado de estas consultas sería

Código:
dias_de_diferencia
----------------------------
8
Es decir, al aplicar la doble conversión al SYSDATE "eliminamos" la parte de la hora a la fecha (en realidad se asigna 00:00:00.000) de tal manera que el resultado no presenta parte decimal. De esta manera creo que es claro que hacer to_date(to_char(fecha,'formato'),'formato') NO ES EQUIVALENTE a hacer fecha.

La misma lógica aplicaría para los rangos. Si tuvieras por ejemplo en tu tabla la fecha

2011-04-12 12:04:24

y compararas simplemente que fecha >= sysdate, sólo sería verdadera después de las 12:04:23. Si te interesa SÓLO LA FECHA Y NO LA HORA tendrías que hacer la conversión a las dos partes de la comparación.


Estoy de acuerdo contigo en que la función TO_CHAR es la indicada para mostrar las fechas en el formato que quieras, pero en este caso también tiene otras aplicaciónes.

Esperemos los comentarios del compañero PabloJN.

Saludos
Leo.

Última edición por leonardo_josue; 12/04/2011 a las 09:17
  #6 (permalink)  
Antiguo 12/04/2011, 09:34
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: conversion fechas

Tenés toda la razón leonardo....
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #7 (permalink)  
Antiguo 14/04/2011, 02:12
 
Fecha de Ingreso: enero-2009
Mensajes: 32
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: conversion fechas

muchisimas gracias por todo....lo pruebo y ahora os lo digo

saludos
  #8 (permalink)  
Antiguo 14/04/2011, 02:39
 
Fecha de Ingreso: enero-2009
Mensajes: 32
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: conversion fechas

Buenas a todos, me sigue sin funcionar....


Os pongo exactamente lo que hago, primero para probar
Código:
Select * from tabla
where to_date(to_char(imovimientos_fecha, 'dd/mm/yyyy'), 'dd/mm/yyyy') < to_date(to_char('".$fecha."', 'dd/mm/yyyy'), 'dd/mm/yyyy')

Y no me sale nada....

hay que tener en cuenta que el parametro fecha lo paso a traves de un formulario...por php

por cierto en la variable fecha no se si da igual que sea con comillas simples o no importa....

el resultado del envio por fomulario es en formato dd/mm/yyyy

muchas gracias

PD: como puedo envolver el codigo en codigo SQL como haceis vosotros para dejarlo mas claro? :D

gracias por la ayuda

Última edición por PabloJN; 14/04/2011 a las 02:44
  #9 (permalink)  
Antiguo 14/04/2011, 07:18
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: conversion fechas

oye...
el campo imovimientos_fecha de que tipo es?

Muestranos lo siguiente.
Código SQL:
Ver original
  1. DESC tabla;

Y unos cuantos registros para ver la estructura de la tabla.

Código SQL:
Ver original
  1. SELECT *FROM tabla WHERE rownum < 10;

Para mostrar codigo sql señala el codigo y en el combobox que dice highlight en la parte superior de la caja de texto del mensaje escojes SQL.

Si haces la consulta directamente desde SQL de oracle te funciona?
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #10 (permalink)  
Antiguo 14/04/2011, 08:34
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: conversion fechas

Hola de nuevo PabloJN... creo que no te haz dado el tiempo para investigar un poco acerca del manejo de fechas en oracle, no deberías de esperar que el código que aquí te proponemos te funcione simplemente con copiar y pegar. La mayoría de las veces tendrás que hacer adecuaciones al código para adecuarlo a lo que necesitas. Ojo con eso.

Ahora bien, de acuerdo a lo que entendí, el parámetro $fecha es de tipo texto, ya que proviene de un formulario correcto??? lo primero que deberías decirnos es cuál es el formato de la cadena, ya que de ahí dependerá si se tiene que cambiar el formato o no.

Para el ejemplo voy a suponer que $fecha = '2011-04-12'.

supongamos tenemos una tabla con los siguientes datos

Código SQL:
Ver original
  1. CREATE TABLE tabla (fecha DATE);
  2.  
  3. INSERT INTO tabla VALUES (to_date('2011-04-11 12:04:24', 'yyyy-mm-dd hh24:mi:ss'));
  4. INSERT INTO tabla VALUES (to_date('2011-04-12 15:05:16', 'yyyy-mm-dd hh24:mi:ss'));
  5. INSERT INTO tabla VALUES (to_date('2011-04-13 13:07:10', 'yyyy-mm-dd hh24:mi:ss'));
  6. INSERT INTO tabla VALUES (to_date('2011-04-11 11:04:24', 'yyyy-mm-dd hh24:mi:ss'));
  7. INSERT INTO tabla VALUES (to_date('2011-04-12 09:05:16', 'yyyy-mm-dd hh24:mi:ss'));
  8. INSERT INTO tabla VALUES (to_date('2011-04-13 21:07:10', 'yyyy-mm-dd hh24:mi:ss'));

Código:
fecha
------------------------------
2011-04-11 12:04:24
2011-04-12 15:05:16
2011-04-13 13:07:10
2011-04-11 11:04:24
2011-04-12 09:05:16
2011-04-13 21:07:10
para encontrar los registros que tengan una fecha menor al parámetro $fecha la consulta quedaría más o menos así:

Código SQL:
Ver original
  1. /*con el valor directo*/
  2. SELECT to_char(fecha, 'yyyy-mm-dd hh24:mi:ss') FROM tabla WHERE
  3. to_date(to_char(fecha, 'dd/mm/yyyy'), 'dd/mm/yyyy') <
  4. to_date('2011-04-12', 'yyyy-mm-dd')
  5.  
  6. /*con el parámetro $fecha*/
  7. SELECT to_char(fecha, 'yyyy-mm-dd hh24:mi:ss') FROM tabla WHERE
  8. to_date(to_char(fecha, 'dd/mm/yyyy'), 'dd/mm/yyyy') <
  9. to_date('".$fecha."', 'yyyy-mm-dd)

es decir, si observas en la parte donde se utiliza el parámetro $fecha NO SE HACE UNA CONVERSION TO_DATE-TO_CHAR, ya que este parámetro ya es una cadena y tiene un formato de fecha especificado, por lo tanto sólo es necesario cambiar esa cadena a fecha, y lo hacemos con un TO_DATE simple.

La conversión TO_DATE-TO_CHAR se hace cuando estás trabajando con campos tipo fecha, convertimos primero a cadena con el formato que queremos para obtener una cadena y después esa cadena la convertimos nuevamente a fecha.

el resultado de la consulta sería:

Código:
fecha
------------------------------
2011-04-11 12:04:24
2011-04-11 11:04:24
Te repito, este ejemplo funcionaría considerando que $fecha = '2011-04-12'. Si el parámetro tiene otro formato entonces habría que hacer algunas adecuaciones.

Haz algunas pruebas, pregúntale a SAN GOOGLE cómo se manejan las fechas en Oracle para ver si obtienes alguna respuesta, y si continuas con problemas, responde las preguntas que te hizo el compañero Huesos52 para tratar de ayudarte.

Saludos
Leo.
  #11 (permalink)  
Antiguo 15/04/2011, 01:53
 
Fecha de Ingreso: enero-2009
Mensajes: 32
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: conversion fechas

Cita:
Iniciado por huesos52 Ver Mensaje
oye...
el campo imovimientos_fecha de que tipo es?

Muestranos lo siguiente.
Código SQL:
Ver original
  1. DESC tabla;

El campo imovimientos es date...aunque realmente el nombre del campo es mvm_fehoin pero bueno, es lo mismo


Y unos cuantos registros para ver la estructura de la tabla.

Código SQL:
Ver original
  1. SELECT *FROM tabla WHERE rownum < 10;

te he puesto unos cuantos campos porque serian muchisimos...

MVM_FEHO MVM_CODIGO MVM_PROPIE
-------- ---------- ----------
21/11/08 16005 0
21/11/08 16006 0
21/11/08 16007 0
21/11/08 16017 0
21/11/08 16022 0
21/11/08 16027 0
21/11/08 16029 0
21/11/08 16031 0
21/11/08 16032 0

Para mostrar codigo sql señala el codigo y en el combobox que dice highlight en la parte superior de la caja de texto del mensaje escojes SQL.

Si haces la consulta directamente desde SQL de oracle te funciona?
  #12 (permalink)  
Antiguo 15/04/2011, 02:04
 
Fecha de Ingreso: enero-2009
Mensajes: 32
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: conversion fechas

Muchas gracias a todos por la ayuda....voy a responder a algunas dudas...

el formato de la variable $fecha...la envio con el siguiente formato

$fecha = dd/mm/yyyy tal cual...no con guiones medios pero puedo pasarlo a guiones medios sin problemas de ningun tipo

Por otro lado, lo que me sorprende es que si pongo en oracle directamente con el cliente nt sql plus la fecha me salga en formato dd/mm/yyyy pero si lo pongo por php me sale

2011-04-11 12:04:24
2011-04-11 12:05:16
2011-04-11 12:07:10


saludos y gracias,
  #13 (permalink)  
Antiguo 15/04/2011, 07:49
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: conversion fechas

Vos tenes problemas al mostrar los datos o al traer los datos correctos?.

prueba esto:

Código PHP:
Ver original
  1. $sql = "SELECT TO_CHAR(imovimientos_fecha,'DD/MM/YYYY') FROM tabla WHERE TO_DATE(TO_CHAR(imovimientos_fecha, 'DD/MM/YYYY'), 'DD/MM/YYYY') < TO_DATE('".$fecha." 00:00:00', 'DD/MM/YYYY HH24:MI:SS')";
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #14 (permalink)  
Antiguo 15/04/2011, 08:39
 
Fecha de Ingreso: enero-2009
Mensajes: 32
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: conversion fechas

BUenas...

Me ha funcionado lo que ha puesto el amigo Leonardo...

He cambiado la mascara de entrada de la variable $fecha= dd/mm/yyyy por $fecha=yyyy-mm-dd y asi si que funciona todo correctamente, como lo ha expuesto

Lo ideal seria que pudiera recoger la variable $fecha = dd/mm/yyyy y poder compararlo asi, ya que estamos en españa y es el formato habitual pero bueno, tampoco es el fin del mundo

muchas gracias a todo

Pd: Huesos52 voy a probar lo tuyo y t digo lo que saale

un abrazo
  #15 (permalink)  
Antiguo 15/04/2011, 09:03
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: conversion fechas

Hola de nuevo PabloJN:

Tu puedes manejar el formato que más prefieras, es justamente una de las ventajas que proporcionan las funciones TO_CHAR y TO_DATE, para utilizar el formato que mencionas (dd/mm/yyyy) sólo tendrías que cambiar la última línea de código:

Código:
to_date('".$fecha."', 'dd/mm/yyyy') 
Saludos
Leo
  #16 (permalink)  
Antiguo 18/04/2011, 01:49
 
Fecha de Ingreso: enero-2009
Mensajes: 32
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: conversion fechas

Muchisimas gracias a todos por la ayuda :D, me ha sido muy util...
  #17 (permalink)  
Antiguo 25/05/2011, 12:01
 
Fecha de Ingreso: marzo-2011
Ubicación: guate
Mensajes: 2
Antigüedad: 13 años, 1 mes
Puntos: 0
pregunta: conversion fechas

buena tarde: tengo un problema que no puedo resolver!! el asunto es el siguiente:
tengo este procedure el cual quiero utilizar desde VB del cual mandare una "fecha"

hago la salvedad en la tabla INF2_CARGA_ERR el campo Fecha es de tipo TIMESTAMP para guardar hora del registro
pero a modo de consulta solo quiero mandar YYYY-MM-DD


Cita:
create or replace
PROCEDURE INF2_SEL_CARGA_ERR_FECHA
(
P_FECHA IN INF2_CARGA_ERR.FECHA%TYPE,
salida OUT sys_refcursor
)
is
BEGIN
OPEN salida FOR
SELECT *
FROM DBAINFRA2.INF2_CARGA_ERR
WHERE trunc(FECHA)=(P_FECHA,FECHA);

EXCEPTION
WHEN NO_DATA_FOUND THEN

NULL;
when others then
if SQLCODE = -1 then
Raise_Application_Error(-20000,'Ya existe el Registro');
else
Raise_Application_Error(-20001,'Error en Oracle'||SQLCODE||SQLERRM);
end if;
END INF2_SEL_CARGA_ERR_FECHA;
el problema es que solo me recibe la fecha si la introdusco de modo



to_date('2011-05-23','yyyy-mm-dd')


y quisiera que me recibiera solamente YYYY-mm-dd

Última edición por sergi57; 25/05/2011 a las 12:08

Etiquetas: conversion, fechas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:39.