Page 1 sur 1

Arrondir une date à la journée, Oracle et PostgreSQL

Posté : mar. 19 déc. 2017 11:56
par Phil
Merci à Cassandre pour sa question :

c'est pour une erreur ORACLE que je ne comprends pas
je cherche à mettre les secondes à vides sur une date de naissance car ça me génère des rejets d'intégration de messages
je balance ça :
update t1 set c1=to_date(to_char(c1,'dd/mm/yyyy')) where c2 in (select c2 from t2);
et il me renvoie l'erreur ora-01843 not a valid month


Réponse :
Les to_date, to_char etc. sont très "Oracle Database" et spécifiques à leur type DATE qui est précis à la seconde au lieu d'être précis à la journée.
Lorsque ces fonctions sont utilisées sur un TIMESTAMP, il y a d'ailleurs d'abord une conversion en DATE.
L'erreur obtenue vient du fait qu'il faut donner le format pour le to_char mais aussi le redonner pour le to_date et donc écrire :

Code : Tout sélectionner

Connected to:
Oracle Database 11g Release 11.2.0.3.0 - 64bit Production

update t1 set c1=to_date(to_char(c1,'DD/MM/YYYY'), 'DD/MM/YYYY') where c2 in (select c2 from t2);
Plus simplement, il est possible d'écrire :

Code : Tout sélectionner

update t1 set c1=trunc(c1, 'DD') where c2 in (select c2 from t2);
La précision à la journée est le défaut pour la fonction trunc donc cette syntaxe fonctionnerait également :

Code : Tout sélectionner

update t1 set c1=trunc(c1) where c2 in (select c2 from t2);
A noter qu'au passage à PostgreSQL il suffirait de déclarer la colonne c1 de type DATE pour automatiquement obtenir une précision à la journée. Pour modifier la précision d'un TIMESTAMP la fonction date_trunc est disponible.