Определить формат даты для базы данных в оракуле
Я пытаюсь выполнить следующий SQL:
INSERT INTO "x"
("x_id", "requested_function", "user_action", "t_users_id", "date", "wf_process", "details")
VALUES
('66', 'index', 'view', '1', '2011-02-04 22:14:19', '15', '');
..но я получаю эту ошибку: ORA-01861: литерал не соответствует строке формата.
Эта ошибка решена, если я добавлю формат даты как это:
INSERT INTO "x"
("x_id", "requested_function", "user_action", "t_users_id", "date", "wf_process", "details")
VALUES
('66', 'index', 'view', '1',to_date('2011-02-04 22:14:19','yyyy-mm-dd hh24:mi:ss'), '15', '');
Я не хочу определять формат даты для каждого оператора SQL, я хочу, чтобы этот формат был стандартным для всех полей даты в базе данных, без необходимости определять его, другими словами, первый оператор SQL должен работать правильно без каких-либо ошибок,
Могу ли я определить формат даты для базы данных Oracle, поэтому нет необходимости определять его снова с каждым оператором SQL?
3 ответа
Это неправильный способ думать о программировании. Неявное это плохо, явное это хорошо. Если вы просто добавляете строку в столбец данных и надеетесь, что значение по умолчанию работает так, как вы ожидаете, вы, скорее всего, будете создавать ошибки и проблемы с производительностью.
Но я не смогу получить ответ на вопрос.
Измените параметр инициализации NLS_DATE_FORMAT.
Это довольно плохой SQL. Две проблемы: 1) Oracle не сможет оптимизировать (придется анализировать каждый раз, когда вы выполняете запрос), что замедляет работу базы данных; и 2) Вы открыты для атак с использованием SQL-инъекций.
Гораздо лучше использовать параметризованные запросы с подготовленными утверждениями, которые решат как вышеуказанные проблемы, так и проблему форматирования даты.
РЕДАКТИРОВАТЬ: Чтобы напрямую ответить на ваш вопрос, и если вы действительно не хотите переходить на подготовленные заявления (вас предупредили!), То вы можете сделать что-то вроде этого:
INSERT INTO X VALUES (99, TO_DATE('2010/02/04 16:30:00', 'YYYY/MM/DD HH24:MI:SS'));
Но опять же, это очень плохая идея по причинам, указанным выше
Стандарт SQL92 для литералов даты и времени - это то, что нужно.
TIMESTAMP 'YYYY-MM-DD HH:MM:SS'
DATE 'YYYY-MM-DD'
TIME 'HH:MM:SS'
Пример использования этого будет:
INSERT INTO X VALUES (99, TIMESTAMP '2010-02-04 16:30:00');