Oracle - ora-01841 to date

 
Vista:
sin imagen de perfil
Val: 5
Ha disminuido su posición en 4 puestos en Oracle (en relación al último mes)
Gráfica de Oracle

ora-01841 to date

Publicado por ivan (3 intervenciones) el 07/11/2016 12:42:57
Hola ,que tal todo?
os queria pedir un pequeño consejo... llevo intntando realizar una tarea unos dias y la verdad es que me da un fallo a la hora de realizar un cast.

La cosa es que tengo una tabla. Con 5 campos, todos son string(el to number del final funciona, el fallo esta en el to_date)... y necesito crear otra tabla que modifique algunos de esos campos que son string a date. Pero hay algunos valores de fecha nulos , por ejemplo año 0000 o mes 00 o dia 00. por lo cual tengo este codigo.


create table tmp_mibebeyyo_core
as
select
cod_id,
cod_zipcode,
str_email,

to_date((case when (FEC_BIRTHDAYMOM) like '0000%' then null when (FEC_BIRTHDAYMOM) like '%-00%' then null else (FEC_BIRTHDAYMOM) end ),'YYYY-MM-DD')as FEC_BIRTHDAYMOM ,
to_date((case when (fec_birthdaybaby) like '0000-%' then '1990-10-01' when (fec_birthdaybaby) like '%-00%' then '1990-10-01' else (fec_birthdaybaby) end),'YYYY-MM-DD') as FEC_BIRTHDAYBABY ,

to_number(substr(md5(cast(cod_id || cod_zipcode || str_email || fec_birthdaymom || fec_birthdaybaby as varchar2(32))||'mibebeyyo'),10,16),
'xxxxxxxxxxxxxxxx') as cod_product

from
tmp_mibebeyyo;


El problema esta en el to_date... que parece ser que hace el cast antes de poner el valor nulo y me dice que el año 0000 no es valido (Error SQL: ORA-01841: el valor (completo) del año debe estar entre -4713 y +9999, y no debe ser igual a 0)


Puse que en vez de null fuera una fecha... pero no, sigue persistiendo el mismo error.... Algún consejo?

Muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 819
Oro
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

ora-01841 to date

Publicado por Rafael (328 intervenciones) el 08/11/2016 09:00:00
A ver yo es que pondría el TO_DATE al final... mira
1
2
3
4
5
6
7
8
9
10
11
12
...
CASE
	WHEN FEC_BIRTHDAYMOM LIKE '0000%' THEN NULL
	WHEN FEC_BIRTHDAYMOM LIKE '%-00%' THEN NULL
	ELSE TO_DATE(FEC_BIRTHDAYMOM,'YYYY-MM-DD')
END AS FEC_BIRTHDAYMOM,
CASE
	WHEN FEC_BIRTHDAYBABY LIKE '0000-%' THEN TO_DATE('1990-10-01','YYYY-MM-DD')
	WHEN FEC_BIRTHDAYBABY LIKE '%-00%'  THEN TO_DATE('1990-10-01','YYYY-MM-DD')
	ELSE TO_DATE(FEC_BIRTHDAYBABY,'YYYY-MM-DD')
END AS FEC_BIRTHDAYBABY
...

Espero te sirva...

Saludos
Pd. Si te sirve la info a mi me sirve un +1
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 5
Ha disminuido su posición en 4 puestos en Oracle (en relación al último mes)
Gráfica de Oracle

ora-01841 to date

Publicado por ivan (3 intervenciones) el 08/11/2016 11:34:24
ME sirve, pero ahora me da un error de mes para fecha incorrecta, La idea es que cuando encuentra una fecha incorrecta me lo ponga a null o a una valida... se puede poner en la query un if... fecha-incorrecta= null y si no es incorrecta que haga el cast a date?


edit : PD muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 819
Oro
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

ora-01841 to date

Publicado por Rafael (328 intervenciones) el 08/11/2016 11:49:10
Pues mira quizás lo mas fácil seria hacer una función ...

Algo como esto:
1
2
3
4
5
6
7
8
9
10
11
12
CREATE FUNCTION ES_FECHA
(FECHA VARCHAR2
,RETORNO_ERROR DATE
)
RETURN DATE
IS
	V_DATE DATE;
BEGIN
	SELECT TO_DATE(FECHA,'YYYY-MM-DD') INTO V_DATE FROM DUAL;
	RETURN V_DATE;
	EXCEPTION WHEN OTHERS THEN RETURN RETORNO_ERROR;
END;


De tal modo que tu query quedaría...
1
2
3
4
5
6
7
8
9
CREATE TABLE TMP_MIBEBEYYO_CORE
AS
SELECT COD_ID
     , COD_ZIPCODE
	 , STR_EMAIL
	 , ES_FECHA(FEC_BIRTHDAYMOM, NULL) FEC_BIRTHDAYMOM
	 , ES_FECHA(FEC_BIRTHDAYBABY, TO_DATE('1990-10-01', 'YYYY-MM-DD')) FEC_BIRTHDAYMOM
     , TO_NUMBER(SUBSTR(MD5(CAST(COD_ID || COD_ZIPCODE || STR_EMAIL || FEC_BIRTHDAYMOM || FEC_BIRTHDAYBABY AS VARCHAR2(32))||'MIBEBEYYO'),10,16),'XXXXXXXXXXXXXXXX') AS COD_PRODUCT
FROM   TMP_MIBEBEYYO;


Saludos....
Pd. Si te sirve la info a mi me sirve un +1
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 5
Ha disminuido su posición en 4 puestos en Oracle (en relación al último mes)
Gráfica de Oracle

ora-01841 to date

Publicado por ivan (3 intervenciones) el 08/11/2016 12:08:36
mil gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar