Je souhaite simplement mettre à jour la partie jour d'une date pour tous les enregistrements de la table. Par exemple, si la date est 16-AUG-18
. Je veux simplement mettre à jour le jour 16
à 15
. Il y a des données dans cette colonne particulière comme:
16-AOÛ-16
16-AOÛ-17
17-AOÛ-18
16-AUG-19
17-AUG-20
17-AUG-21
Je veux mettre à jour juste le jour et le faire comme:
15-AOÛ-16
15-AOÛ-17
15-AOÛ-18
15-AUG-19
15-AUG-20
15-AUG-21
J'utilise oracle 12C comme base de données. Et les dates sont au format DD-MON-YY
5 Réponses :
J'ai utilisé comme:
UPDATE <Table_Name> SET DATE_COLM = CASE extract(DAY FROM DATE_COLM) WHEN 16 THEN DATE_COLM-1 WHEN 17 THEN DATE_COLM-2 END WHERE extract(MONTH FROM DATE_COLM) = 8 AND extract(DAY FROM DATE_COLM) > 15;
Mais je ne suis pas satisfait de cette requête. Je recherche simplement une requête plus efficace.
Une option consiste à les mettre à jour un par un, par exemple
SQL> alter session set nls_date_format = 'dd.mm.yyyy'; Session altered. SQL> select trunc(sysdate, 'mm') + 14 result from dual; RESULT ---------- 15.02.2019
Je n'ai aucune idée de ce que vos dates représentent (qu'est-ce qu'un jour et qu'est-ce qu'une année dans, par exemple, 16-AUG-19
); vous devez le spécifier.
Sinon , si possible, vous pouvez calculer une nouvelle date comme
update your_table set date_column = trunc(date_column, 'mm') + 14 where date_column in (date '2016-08-16', date '2016-08-17');
TRUNC
avec le masque de format mm
renvoie le premier jour de ce mois. Par exemple:
update your_table set date_column = case when date_column = date '2016-08-16' then date '2016-08-15' when date_column = date '2016-08-17' then date '2016-08-15' else date_column end;
La première solution ne fonctionnera pas. Mais assez impressionné par la deuxième solution.
Mais cette deuxième solution fonctionnera-t-elle avec la mienne, car le format de la date est JJ-MMM-AA
Eh bien, la première solution fonctionnerait , mais ce serait un travail fastidieux. Si le second vous satisfait, c'est encore mieux.
À partir du DD-MON-YY: si le type de données de la colonne est DATE, alors oui - cela fonctionnera, pas de problème. JJ-MON-YY est exactement comment vous voyez cette date.
J'ai joué rapidement sur une table de test que j'ai créée.
update your_table set your_column = col1 + (20 - to_number(to_char(col1, 'dd')));
Pour l'utiliser dans une instruction de mise à jour, utilisez
create table table_a (col1 date); insert into table_a (col1) values (trunc(sysdate)); insert into table_a (col1) values (trunc(sysdate + 10)); insert into table_a (col1) values (trunc(sysdate - 10)); commit; select * from table_a; The select below shows how to set the day to the 20th of the month select col1 target_date, col1 + (20 - to_number(to_char(col1, 'dd'))) changed_date, 20 - to_number(to_char(col1, 'dd')) factor_to_add from table_a; select * from table_a; TARGET_DA CHANGED_D FACTOR_TO_ADD --------- --------- ------------- 07-FEB-19 20-FEB-19 13 17-FEB-19 20-FEB-19 3 28-JAN-19 20-JAN-19 -8
Et évidemment - changez le nombre 20 en n'importe quel jour du mois que vous recherchez.
très simple
update your_Table set date_column= date_column-1;
Commencez par voir et comprendre l'exigence.
Je garderais les choses simples. Étant donné que votre journée (15) est garantie * d'être présente tous les mois, il devrait être prudent de simplement remplacer la date par un littéral 15, par exemple:
update mytable set mydate = to_date( '15-' || to_char(mydate,'MM-YYYY'), 'DD-MM-YYYY') where to_char(mydate,'DD') != '15';
Attention: cette mise à jour tronquera tout partie de temps (au moins, pour les lignes qui ne sont pas déjà le 15 du mois).
* ps ce n'est pas techniquement vrai pour tous les jours du mois; 29, 30, 31 ne sont pas présents tous les mois; et en septembre 1752, le mois n’avait pas de jours 3 à 13 (le calendrier grégorien passait du 3 au 14).
Vous voulez dire que vous voulez simplement la veille.
Non, il peut y avoir n'importe quel jour. Je veux tout faire comme
15
Utilisez le format de date approprié, AAAA-MM-JJ. (16-AUG-17 signifie-t-il 2016-08-17 ou 2017-08-16?)
Il est au format
JJ-MMM-AA
. Donc16-AUG-17
signifie 16 août 2017@DK Ansh Les colonnes de date Oracle n'ont pas de format ; c'est exactement ce que vous voyez lorsque les résultats d'une requête sont convertis pour l'affichage. Comme cela a été dit, évitez d'utiliser
YY
car il est ambigu.