Изменить формат даты, который читает MySQL

У меня есть командный файл, созданный для базы данных Oracle, которую я сейчас пытаюсь импортировать в базу данных MySQL. Мне приходилось иметь дело со всевозможными несоответствиями между ними. В файле все даты указаны как «17 ноября 1981 года», а не «1981-11-17», как ожидает MySQL.

В пакетном файле была команда ALTER SESSION установить nls_date_format = 'ДД-МЕСЯЦ-ГГГГ'; для установки формата даты. Есть ли эквивалент в MySQL, чтобы заставить его принимать даты как есть, без необходимости значительного редактирования файла?

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
4 849
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не верю, что это возможно без изменения SQL.

STR_TO_DATE можно использовать в операторах вставки для преобразования строк, или вы можете попробовать передать файл через sed и использовать регулярное выражение для определения дат и их переработки, например что-то вроде этого заменит даты в исходном дампе с одинарными кавычками на вызовы str_to_date и направит полученный преобразованный sql в mysql ...

cat oracledump.sql |  sed "s/'[0-9][0-9]-\(JAN\|FEB\|MAR\|APR\|MAY\|JUN\|JUL\|AUG\|SEP\|OCT\|NOV\|DEC\)-[1-2][0-9][0-9][0-9]'/str_to_date(&, '%d-%b-%Y')/g" | mysql newdb

Я изменил конец на> output.sql, но все, что у меня было, это точно такой же файл. Даты не изменились.

thornate 01.01.2009 15:05

Возможно, вам нужно настроить регулярное выражение для ваших данных, но я тестировал его на образце файла перед публикацией. Зачем писать фрагмент вашего SQL?

Paul Dixon 01.01.2009 15:12

Обратите внимание, что он искал даты в двойных кавычках, для одинарных кавычек вы можете использовать sed 's / "[0-9] [0-9] - (ЯНВАРЬ \ | ФЕВ \ | МАР \ | АПРЕЛЬ \ | МАЙ \ | ИЮН \ | ИЮЛЬ \ | АВГУСТ \ | ‌ СЕНТ \ | ОКТ \ | НОЯ \ | ДЕКАБРЬ 41; - [1-2] [0-9] [0-9] [‌ 0-9] "/ str_to_date (& , "% d-% b-% Y") / '

Paul Dixon 01.01.2009 15:19

Нет, это были даты с одинарной кавычкой. Пример полной строки выглядит следующим образом: INSERT INTO ord (TOTAL, SHIPDATE, ORDID, ORDERDATE, CUSTID, COMMPLAN) VALUES ('710', '06 -FEB-2002 ',' 615 ', '01 -FEB-2002', '107', '');

thornate 01.01.2009 15:37

Я забыл добавить глобальный модификатор (буква «g» после шаблона). sed "s / '[0-9] [0-9] - (ЯНВ \ | ФЕВ \ | МАР \ | АПР \ | МАЙ \ | ИЮН \ | ИЮЛЬ \ | АВГ \ | ‌ СЕНТ \ | ОКТ \ | НОЯБ \ | DEC‌ 41; - [1-2] [0-9] [0-9] [‌ 0-9] '/ str_to_date (&,'% d-% b-% Y ') / g "сработало для меня на ваших тестовых данных (обратите внимание, что я использую оболочку bash)

Paul Dixon 01.01.2009 16:13

Ура! Это отлично сработало. Мне пришлось изменить его снова после того, как я понял, что даты от 1 до 9 были напечатаны только с одной цифрой, но теперь все загружено правильно. Спасибо.

thornate 01.01.2009 16:25

Другие вопросы по теме