Импортировать часы, минуты, секунды из csv в столбец отметок времени во внешней таблице - PullRequest
0 голосов
/ 09 октября 2019

Я пытаюсь преобразовать файл данных csv в таблицу базы данных оракула. Для этого я буду использовать внешнюю таблицу, как описано здесь .

Метка времени в моем csv разделена на дату ( гггг-мм-дд ) с одной стороны и время ( чч24: мм: сс ) напрочее.

В моей таблице 3 столбца:

create table backup_ext
(
    "user"    NVARCHAR2(20),
    "date"    DATE,
    "hour"    TIMESTAMP
)

Вот как выглядит CSV:

john,2018-05-28,10:17:57

Мне нужно, чтобы эти три значения были в трех отдельныхстолбцы в моей таблице.

Проблема, с которой я столкнулся, заключается в том, что пользователь и дата отображаются в ожидаемом формате, но час содержит дату и время, например:

user        |date        |hour
----------------------------------------
john         28-MAY-18    01-OCT-19 10.17.57.000000000

Я хотел бы что-то вроде этого:

user        |date        |hour
----------------------------------------
john         28-MAY-18    10.17.57

Другие особенности :

  • Я хочу избегать как можно большего изменения типа столбца, так как ониспользуется как есть во многих других областях программы, и я не хочу ничего ломать
  • Таблица была создана таким образом для использования с MSSQL, и мне было поручено адаптировать ее для работы с Oracle,это может объяснить выбор типов столбцов
  • Я потенциально могу запустить второй битВпоследствии SQL-код для форматирования столбца, хотя я не знаю точно, как это сделать
  • Я могу работать только с SQL-операторами, поскольку это должно быть сделано с помощью кода C ++, создающего операторы и запрашивающего базу данных с помощьюуказанные заявления

Любая помощь будет принята с благодарностью

Полный код:

create table backup_ext
(
    "user"    NVARCHAR2(20),
    "date"    DATE,
    "hour"    TIMESTAMP
)
organization external
(
     type oracle_loader
     default directory csvdir
     access parameters 
     (
         records delimited by newline
         skip 1
         fields terminated by ';' lrtrim
         missing field values are null
         (
             "user",
             "date" date 'yyyy-mm-dd',
             "hour" Char Date_Format Timestamp Mask 'hh24:mi:ss',
         )
     )
     location ('backup.csv')
)
reject limit unlimited;

1 Ответ

3 голосов
/ 09 октября 2019

Вы говорите, что не хотите ничего менять, но вы уже перенесли это с SQL Server на Oracle ... СЕЙЧАС настало время это исправить, или вы будете ненавидеть жизнь за все времяподдержка этого приложения / базы данных в будущем.

Вам нужны только два столбца для ваших данных

DROP TABLE BACKUP_EXT;

CREATE TABLE BACKUP_EXT (
       USERNAME    VARCHAR2(20),
       OCCURENCE   DATE
);

INSERT INTO BACKUP_EXT VALUES (
       'john',
       TO_DATE('28-MAY-18 10.17.57', 'DD-MON-RR HH.MI.SS')
);

COMMIT;

SELECT USERNAME "user",
       TO_CHAR(OCCURENCE, 'DD-MON-RR') "date",
       TO_CHAR(OCCURENCE, 'HH.MI.SS') "hour"
  FROM BACKUP_EXT;

Выполните это ... и мы вернемся ...

Table BACKUP_EXT dropped.


Table BACKUP_EXT created.


1 row inserted.


Commit complete.

user   date        hour       
john    28-MAY-18    10.17.57    

Используйте правильный тип данных -> ДАТА. DATE содержит момент времени, поэтому он включает в себя часть времени, а не только месяц, день, год.

Не используйте NVARCHAR2 - большинство современных баз данных Oracle используют уже набор символов на основе Unicode, поэтому это не нужно,особенно для предоставленных вами тестовых данных.

Не используйте зарезервированные слова, такие как DATE или USER, для имен таблиц или столбцов - это вызовет гораздо больше проблем, чем решит их путем кавычек.

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