Remplacer des / par des - sans perdre la valeur dans le champs via SQL - SQL/NoSQL - Programmation
Marsh Posté le 09-10-2008 à 12:04:42
faire une procédure stockée qui te renvoie un flag si ta chaine est une date valide ou pas, appeler cette procédure dans le where de ton update, et faire un replace sur les lignes retenues.
on est bien d'accord que tes dates sont dans une colonne de type caractère?
le bon truc au final reste de transformer ta colonne en format date.
Marsh Posté le 09-10-2008 à 12:13:00
Merci de ta réponse,
Je n'ai jamais constuit de procédure stockée. je vais chercher un peu pour trouver comment en construire
Merci pour cette info.
On est d'accord cette colonne est de type caractère.
Marsh Posté le 09-10-2008 à 12:33:48
En Oracle, il serait facile de faire cela en convertissant dd/mm/yyyy en une date, et en convertissant cette-dernière en dd-mm-yyyy.
select to_char(to_date(champ_date, 'dd/mm/yyyy'), 'dd-mm-yyyy') |
Peut-être qu'il serait posible de faire quelque chose d'équivalent en Postgres.
Marsh Posté le 09-10-2008 à 13:31:50
le seul soucis avec ca c'est que pour les dates non valides cela va générer une exception et donc faire foirer l'update, c'est pour ca qu'il faut passer par une procédure stockée, catcher l'exception, et renvoyer une valeur qui permet de le savoir.
y a ptetre moyen de faire autrement en postgres mais je suis pur oracle
mais bon perso je me suis fait une fonction is_date_valid(str varchar2,mask varchar2) return date qui retourne null si le cast n'est pas possible
Marsh Posté le 09-10-2008 à 14:18:24
Le souci c'est que je dois garder toute mes dates renseignées et liées avec un id
ex: id 753 le champ value = 25/05/2008
id 754 le champ value = 26/06/2008
Comment je pourrais faire pour associé toujours a l'id en question et en même temps modifier le value?
id 753 le champ value = 25-05-2008 et faire cela sur 235 lignes enregistrées?
Passer par un import via txt
Je n'ai pas trouvé d'explication simple pour créer une procédure stockée. Savez-vous s'il existe un tutau ? pour apprendre vite genre 1 heure?
Merci
Marsh Posté le 09-10-2008 à 15:00:49
2 questions :
1/ c'est du one shot ?
2/ toutes les valeurs de date sont des dates valides ou nulles ?
si tu dis 2 fois "oui", alors :
Code :
|
Avec le détail de la structure de tes deux tables (ou au moins une requête select correctement écrite avec des préfixes devant les champs qu'on sâche d'où ils viennent) et on peut même te proposer la requête complète et fonctionnelle.
PS : oui, je sais, le REPLACE est de loin la solution la plus cadre, puisqu'il ne fait aucune vérification, d'où les deux questions préliminaires. si elles sont respectées, alors ça vaut clairement pas le coup de s'emmerder à faire des contrôles par contre.
Marsh Posté le 09-10-2008 à 15:50:17
Voici ce que j'ai fais et ton exemple reprend exactement la même chose:
J'ai fais une recherche de tout mes id présents
SELECT id, bug_id, status, field_id, "value"
FROM bug_table
INNER JOIN custom_field_string_table on custom_field_string_table.bug_id = bug_table.id
WHERE status like '90'
and field_id in ('177','178')
and "value" not like 'jj/mm/aaaa'
order by field_id ASC;
En suite j'ai copié le resultat des bug_id et j'ai fais cette requete :
UPDATE custom_field_string_table
set "value"=replace("value",'/','-')
where bug_id in ('1543','1192','1470','346','347','281','1382')
and field_id in ('177','178')
Et tout s'est bien passé.
Merci pour votre aide et j'espère que cela pourra aider d'autres personnes.
Bonne journée a tous,
Merci
Marsh Posté le 09-10-2008 à 11:57:19
Bonjour à tous,
Voila, je rencontre un petit souci dans une base de donnée postgréSQL. Je cherche a remplacer la valeur d'un champ date au format
jj/mm/aaaa par du jj-mm-aaaa
J'ai aujourd'hui 476 lignes renseignées avec des dates et du format jj/mm/aaaa, je ne peux absolument pas perdre les dates renseignées et je dois faire cette modification remplacer des / par des -.
Pour l'instant, j'ai isolé toutes mes demandes fermées (poids =90) pour pouvoir faire cette manip, mais je ne vois absolument pas comment faire le remplacement de toutes mes lignes qui possèdent une date de renseigné en tout j'ai 235 lignes qui sont sortie avec une date connue.
Comment je peux faire pour modifier ces 235 lignes qui possèdent une date connue et modifier par exemple la date du 08/10/2008 par 08-10-2008 et ce pour toutes mes lignes?
Voici ma requete de recherche:
SELECT id, bug_id, reporter_id, status, summary, field_id, "value"
FROM bug_table
INNER JOIN custom_field_string_table on custom_field_string_table.bug_id = bug_table.id
WHERE status like '90' and field_id like '177' and "value" not like 'jj/mm/aaaa'
J'espère avoir été clair sur mon explication,
Je ne sais pas comment construire ma requete update et je ne me vois pas faire cela a la main.
Avez-vous une idée?
D'avance merci,