Я надеюсь, что это не выглядит слишком резко, но вы должны полностью переосмыслить свой подход здесь.
Вы не придерживаетесь типов данных прямо.Каждая строка в вашем примере неправильно использует тип данных.
- TEMP1.DATE1 - это не дата или varchar2, а НОМЕР
- , который вставляется не числом 40284.3878935185, а STRING>> '40284.3878935185' << </li>
- ваш SELECT TO_DATE (...) использует значение NUMBER Temp1.Date1, но обрабатывает его как VARCHAR2 с использованием блока формата
I'mоколо 95% уверены, что, по вашему мнению, Oracle передает эти данные, используя простые блочные копии данных.«Так как каждая дата Oracle хранится как число, в любом случае, почему бы просто не вставить этот номер в таблицу?»Ну, потому что, когда вы определяете столбец как NUMBER, вы говорите Oracle: «Это не дата».Поэтому Oracle не управляет им как датой.
Каждое из этих преобразований типов рассчитывается Oracle на основе ваших текущих переменных сеанса.Если бы вы были во Франции, где "."это разделитель тысяч, а не основание, INSERT полностью потерпит неудачу.
Все эти преобразования со строками изменяются в соответствии с локалью, в которой Oracle считает, что вы работаете.Проверьте представление словаря V $ NLS_PARAMETERS.
Это ухудшается со значениями даты / времени.Значения даты / времени могут распространяться по всей карте - в основном из-за часового пояса.В каком часовом поясе находится ваш сервер баз данных?Из какого часового пояса он бежит?И если это не достаточно круто, проверьте, что произойдет, если вы измените календарь Oracle по умолчанию с Григорианского на Тайский Будду.
Я настоятельно рекомендую вам избавиться от цифр ВСЁ.
Для создания даты или значений даты и времени используйте строки с полностью инвариантными и однозначными форматами.Затем присвойте, сравните и рассчитайте только значения даты, например:
Постоянная GOODFMT VARCHAR2 = 'ГГГГ-ММ-ДД ЧЧ24: MI: SS.FFF ZZZ'
Good_Time DATE = TO_DATE ('2012-02-17 08: 07: 55.000 EST ', GOODFMT);