1
votes

Comment mettre à jour la partie jour de la date dans la colonne datetime

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 commentaires

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 . Donc 16-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.


5 Réponses :


0
votes

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.


0 commentaires

1
votes

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.
  • l'ajout de 14 (jours) au premier jour renverrait le 15 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;


4 commentaires

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.



0
votes

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.


0 commentaires

0
votes

très simple

update your_Table
set date_column= date_column-1;


1 commentaires

Commencez par voir et comprendre l'exigence.



0
votes

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).


0 commentaires