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

La norme SQL évolue : tirez le meilleur d'un SGBD qui la respecte en écrivant du SQL moderne avec en complément PL/pgSQL, php, java etc.
Répondre
Phil
Administrateur du site
Messages : 291
Enregistré le : mar. 1 sept. 2015 00:38
Localisation : France
Contact :

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

Message 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.
Cdlt. Phil - pgphil.ovh
Répondre