Как обновить дневную часть даты в столбце datetime - PullRequest
0 голосов
/ 07 февраля 2019

Я хочу просто обновить дневную часть даты для всех записей в таблице.Например, если дата 16-AUG-18.Я хочу просто обновить день с 16 до 15.В этом конкретном столбце имеются данные, такие как:

  • 16-AUG-16
  • 16-AUG-17
  • 17-AUG-18
  • 16-AUG-19
  • 17-AUG-20
  • 17-AUG-21

Я хочу обновить только день и сделать так:

  • 15-AUG-16
  • 15-AUG-17
  • 15-AUG-18
  • 15-AUG-19
  • 15-AUG-20
  • 15-AUG-21

Я использую Oracle 12C в качестве базы данных.И даты в формате DD-MON-YY

Ответы [ 5 ]

0 голосов
/ 11 февраля 2019

Я бы сказал проще.Поскольку ваш день (15) гарантированно * присутствует в каждом месяце, следует смело заменять дату литералом 15, например:

update mytable
set mydate = to_date( '15-' || to_char(mydate,'MM-YYYY'), 'DD-MM-YYYY')
where to_char(mydate,'DD') != '15';

Предупреждение: это обновление будет урезать любую часть времени(по крайней мере, для тех строк, которые еще не 15 числа месяца).

* ps это технически не верно для всех дней месяца;29, 30, 31 не присутствуют в каждом месяце;и в сентябре 1752 года в месяце не было дней с 3 по 13 (григорианский календарь пропущен с 3-го по 14-е).

0 голосов
/ 07 февраля 2019

очень просто

update your_Table
set date_column= date_column-1;
0 голосов
/ 07 февраля 2019

Один из вариантов - обновлять их один за другим, например,

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;

Я понятия не имею, что означают ваши даты (что такое день а что такое год в, например, 16-AUG-19);Вы должны указать это.

В качестве альтернативы , если возможно, вы можете вычислить новую дату как

update your_table set
  date_column = trunc(date_column, 'mm') + 14
where date_column in (date '2016-08-16', date '2016-08-17');
  • TRUNCс маской формата mm возвращает первый день этого месяца.
  • добавление 14 (дней) к первому дню возвращает 15-е число этого месяца

Например,:

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
0 голосов
/ 07 февраля 2019

У меня была быстрая игра на тестовом столе, который я создал.

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

Чтобы использовать это в операторе обновления, используйте

update your_table
set your_column = col1 + (20 - to_number(to_char(col1, 'dd')));

И, очевидно, - измените число 20 на любоедень месяца, который вы ищете.

0 голосов
/ 07 февраля 2019

Я использовал как:

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;

Но кое-как, как я не доволен этим запросом.Я просто ищу более эффективный запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...