Как обновить даты, хранящиеся в различных символьных форматах (PL / SQL)? - PullRequest
0 голосов
/ 04 июня 2009

Проблема: у меня есть большая таблица базы данных (~ 500 тыс. Записей), в которой есть список дат, хранящихся в столбце varchar2 (15). Эти даты хранятся в разных форматах, т.е. некоторые - гггг-мм-дд, некоторые - мм / дд / гггг, некоторые - дд / мм / гг, некоторые - мм / дд / гг и т. д. То есть:

1994-01-13
01/13/1994
01/13/94
13/01/94
13/01/1994
etc

Мне нужно немного сместить эти даты, например, добавить 30 дней к каждой дате. (Это упрощение моей цели, но это проще объяснить).

Если бы все даты были отформатированы последовательно, я бы достиг этого следующим образом:

UPDATE history_table
    SET some_date_col = 
        to_char(to_date(some_date_col, 'mm/dd/yyyy')+30, 'mm/dd/yyyy') 
    WHERE some_date_col IS NOT NULL;

Из-за размера базы данных я не могу позволить себе перебирать значения по одному и анализировать значение даты. Кто-нибудь может предложить способ сделать это без циклов, то есть с массовым оператором UPDATE?

Ответы [ 3 ]

4 голосов
/ 04 июня 2009

Форматы этих дат действительно так важны? Они должны быть столбцами даты и времени. Тогда вы можете просто использовать математические функции даты в этом поле.

3 голосов
/ 04 июня 2009

ну, у тебя тут настоящая проблема. 07.07.1994 действителен для «ММ / ДД / ГГГГ» и «ДД / ММ / ГГГГ» Однако, помимо этой проблемы, вы можете попробовать вложение декодирования. Я ввел следующие даты в поле varchar:

01/12/2009, 01-12-2009, 2009-01-12, 01/12/09

и, используя приведенное ниже, меня последовательно возвращали 12.01.2009. Вы должны будете выяснить все возможные шаблоны и продолжать вложение. Другая вещь, которую вы можете сделать, это создать функцию для обработки этого. Внутри функции вы можете проверить немного более подробно относительно формата даты. Это также будет легче читать. Вы можете использовать эту функцию в своем операторе обновления, чтобы она была быстрее, чем цикл, как вы упоминали. (что бы ни стоило, цикл по 500 тыс. строк не должен занимать много времени. Мне регулярно приходится обновлять таблицы по строкам строк из 12 миллионов записей)

выберите mydate, декодирования (Instr (MyDate, '-'), 5, TO_DATE (MyDate, 'YYYY-MM-DD'), 3, TO_DATE (MyDate, 'ДД-ММ-ГГГГ'), decode (длина (mydate), 8, to_date (mydate, 'MM / DD / YY'), 10, to_date (mydate, 'MM / DD / YYYY')))) от mydates;

и вот заявление об обновлении:

обновить набор mydates revdate = decode (instr (mydate, '-'), 5, to_date (mydate, 'YYYY-MM-DD'), 3, to_date (mydate, 'MM-DD-YYYY'), decode (длина (mydate), 8, to_date (mydate, «MM / DD / YY»), 10, to_date (mydate, «MM / DD / YYYY»)))

2 голосов
/ 04 июня 2009

ИМХО, у вас проблема побольше:

Если некоторые даты - дд / мм / гггг, а некоторые - мм / дд / гггг, как вы можете отличить, какой формат применяется к определенной дате?

например, как я могу узнать, что значение "12/09/2008" означает декабрь или сентябрь?

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