diff --git a/database/migrations/2026_06_29_100000_activities_start_end_as_date.php b/database/migrations/2026_06_29_100000_activities_start_end_as_date.php index 8668997..ee9bc92 100644 --- a/database/migrations/2026_06_29_100000_activities_start_end_as_date.php +++ b/database/migrations/2026_06_29_100000_activities_start_end_as_date.php @@ -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'); diff --git a/database/migrations/2026_06_29_120000_fix_activities_end_at_off_by_one.php b/database/migrations/2026_06_29_120000_fix_activities_end_at_off_by_one.php new file mode 100644 index 0000000..7d98fe2 --- /dev/null +++ b/database/migrations/2026_06_29_120000_fix_activities_end_at_off_by_one.php @@ -0,0 +1,44 @@ +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'); + } +};