Почему я вижу значения «2432-82-75 50:08:01» в столбце Oracle DATE? - PullRequest
0 голосов
/ 19 января 2019

В рамках своих должностных обязанностей я отвечаю за извлечение данных из базы данных Oracle 11g нашего поставщика и загрузку их в нашу базу данных SQL Server 2016. Я успешно делал это с SSIS и коннекторами Attunity Oracle.

Сегодня мне сообщили, что в существующую таблицу Invoices на стороне Oracle добавлен новый столбец. Уже был столбец DATE с именем Order Date, который содержит действительные значения даты с нулевым временем, например 2017-12-25 00:00:00.

Новый столбец называется Order Date Time и также является столбцом DATE. Когда я открыл пакет служб SSIS и извлек источник Oracle в своем DFT, я предварительно просмотрел данные и обнаружил, что значения в Order Date Time равны 2432-82-75 50:08:01. Я попытался преобразовать столбец с помощью CAST и всех функций TO_*, но преобразование либо не удалось сразу, либо вернуло строку нулей.

TO_CHAR("Order Date Time", 'YYYYMMDDHH24MISS')

выход 00000000000000

После небольшого поиска в Google "Недопустимое значение даты Oracle", я теперь думаю, что эти значения DATE действительно повреждены. Я что-то здесь упускаю? Есть ли какая-то особая технология, специфичная для Oracle, для хранения значений времени в столбце DATE, о которой я, возможно, не знаю?

(И да, меня немного беспокоит, что наш поставщик добавил еще один столбец DATE вместо того, чтобы просто использовать временную часть существующего столбца Order Date.)

1 Ответ

0 голосов
/ 21 января 2019

К сожалению, ядро ​​базы данных Oracle позволяет вставлять недопустимые значения даты , что приводит ко многим проблемам, особенно при импорте данных в другие ядра базы данных, такие как SQL Server.

Чтобы решить эту проблему, вы должны реализовать логику, которая соответствует вашим потребностям, например:

  • Вы можете исключить эти записи из своих запросов, отфильтровав допустимые диапазоны дат: (ГДЕ дата между ...)
  • Вы можете обновить записи с недопустимыми значениями, заменив на NULL
  • Вы можете использовать оператор CASE в своем запросе для замены значений на NULL

Однажды я столкнулся с этой проблемой при импорте данных в SQL Server из источника данных Oracle, там были недопустимые значения даты, я решил обновить все записи, где дата недействительна, и заменить на значения NULL перед началом процесса импорта.


Есть много ссылок, связанных с этой проблемой:

...