При проектировании базы данных произошла ошибка, и дата и время были обработаны в отдельном поле, которое я хотел бы объединить с помощью миграции. Есть ли простой способ переместить данные из полей даты и времени в поле dateTime без потери существующих данных?

Текущая таблица:

id | publish_date | publish_time
--------------------------------
1  | 2021-01-01   | 10:25:00

Вот как я хочу, чтобы это выглядело без потери данных:

id | publish_date_time
----------------------
1  | 2021-01-01 10:25:00
0
Bálint Bakos 18 Янв 2022 в 13:38
В первую очередь laravel, но я также люблю слушать sql
 – 
Bálint Bakos
18 Янв 2022 в 13:40
Какие дбм? Когда дело доходит до даты/времени, многие продукты далеки от совместимости с ANSI SQL.
 – 
jarlh
18 Янв 2022 в 13:43
5.7.36 — Сервер сообщества MySQL (GPL)
 – 
Bálint Bakos
18 Янв 2022 в 13:46

1 ответ

Для этого можно использовать миграцию:

Вы можете создать его, используя php artisan make:migration MergeDateColumns, а затем выполнить:

class MergeDateColumns extends Migration {
    public function up() {
       Schema::table('your table name', function (Blueprint $table) {
           $table->dateTime('publish_date_time');
       });
       DB::table('your table name')
           ->update([ 'publish_date_time' => DB::raw("CONCAT(publish_date,' ', publish_time)") ]);
       Schema::table('your table name', function (Blueprint $table) {
           $table->dropColumn('publish_date');
           $table->dropColumn('publish_time');
       });
    } 
    public function down() {
       Schema::table('your table name', function (Blueprint $table) {
           $table->date('publish_date');
           $table->time('publish_time');
       });
       DB::table('your table name')
           ->update([ 
              'publish_date' => DB::raw("DATE(publish_date_time)"),
              'publish_time' => DB::raw("TIME(publish_date_time)")
            ]);
       Schema::table('your table name', function (Blueprint $table) {
           $table->dropColumn('publish_date_time');
           $table->dropColumn('publish_time');
       });
    } 

}

Это объединяет столбцы при миграции и снова разделяет их при откате.

Чтобы быть в безопасности, я бы сделал резервную копию данных перед запуском этого на производстве, но я не думаю, что это вызовет проблемы.

1
apokryfos 18 Янв 2022 в 14:02