master
lion 1 week ago
parent 497206264f
commit 6c6ef274ed

@ -18,11 +18,13 @@ return new class extends Migration
DB::statement('ALTER TABLE activities ADD COLUMN start_at_date DATE NULL AFTER start_at');
DB::statement('ALTER TABLE activities ADD COLUMN end_at_date DATE NULL AFTER end_at');
// TIMESTAMP 在 session 时区下读出已是本地时间,不可再 CONVERT_TZ 从 UTC 加偏移end_at 23:59:59 会 +1 天)。
// 旧数据由 Laravel 按 UTC 写入,用 UTC 字符串显式转换。
DB::statement(
"UPDATE activities SET start_at_date = DATE(CONVERT_TZ(start_at, '+00:00', '{$offset}')) WHERE start_at IS NOT NULL"
"UPDATE activities SET start_at_date = DATE(CONVERT_TZ(DATE_FORMAT(start_at, '%Y-%m-%d %H:%i:%s'), '+00:00', '{$offset}')) WHERE start_at IS NOT NULL"
);
DB::statement(
"UPDATE activities SET end_at_date = DATE(CONVERT_TZ(end_at, '+00:00', '{$offset}')) WHERE end_at IS NOT NULL"
"UPDATE activities SET end_at_date = DATE(CONVERT_TZ(DATE_FORMAT(end_at, '%Y-%m-%d %H:%i:%s'), '+00:00', '{$offset}')) WHERE end_at IS NOT NULL"
);
DB::statement('ALTER TABLE activities DROP COLUMN start_at, DROP COLUMN end_at');

@ -0,0 +1,44 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
/**
* 修复 timestamp→date 迁移时 end_at 普遍多 1 天的问题。
*
* 原因:旧数据 end_at 为东八区当日 23:59:59UTC 约 15:59:59
* MySQL 在 session 时区 +08:00 下读取 TIMESTAMP 已是本地 23:59:59
* 再 CONVERT_TZ(..., '+00:00', '+08:00') 会被当作 UTC 再加 8 小时,日历日 +1。
* start_at 为 00:00:00 不受影响;仅 end_at 需回退 1 天。
*/
return new class extends Migration
{
public function up(): void
{
if (! Schema::hasTable('activities')) {
return;
}
$column = DB::selectOne("SHOW COLUMNS FROM activities WHERE Field = 'end_at'");
if (! $column || stripos((string) $column->Type, 'date') === false) {
return;
}
DB::statement('UPDATE activities SET end_at = DATE_SUB(end_at, INTERVAL 1 DAY) WHERE end_at IS NOT NULL');
}
public function down(): void
{
if (! Schema::hasTable('activities')) {
return;
}
$column = DB::selectOne("SHOW COLUMNS FROM activities WHERE Field = 'end_at'");
if (! $column || stripos((string) $column->Type, 'date') === false) {
return;
}
DB::statement('UPDATE activities SET end_at = DATE_ADD(end_at, INTERVAL 1 DAY) WHERE end_at IS NOT NULL');
}
};
Loading…
Cancel
Save