This commit is contained in:
nanguaboss
2026-08-06 00:50:23 +08:00
parent 595520822a
commit 2cb688ed46
29 changed files with 5227 additions and 186 deletions
+67
View File
@@ -0,0 +1,67 @@
<?php
/**
* 时间字段批量转换工具(v1.0.16)
* 需求:mysuperlink 数据库所有数据表的时间字段调整为"年-月-日"(DATETIME/TIMESTAMP -> DATE)。
* 用法:php tools/migrate_time_to_date.php [库名]
* 说明:
* - 自动遍历指定库(默认取 config/database.php 的 dbname)中所有 DATETIME/TIMESTAMP 字段,
* 生成并执行 ALTER TABLE ... MODIFY ... DATE。
* - 对带默认值 CURRENT_TIMESTAMP 的字段,改为 DEFAULT (CURRENT_DATE)(需 MySQL 8.0.13+);
* 若执行环境为 MySQL 5.7,请手动调整或保留 DATETIME。
* - 已存在 DATE 类型的字段不会重复处理;脚本幂等,可重复执行。
*/
require __DIR__ . '/../config/database.php';
$dbname = $argv[1] ?? $cfg['dbname'];
$dsn = sprintf('mysql:host=%s;port=%d;dbname=%s;charset=%s', $cfg['host'], $cfg['port'], $dbname, $cfg['charset']);
try {
$pdo = new PDO($dsn, $cfg['username'], $cfg['password'], [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
} catch (Exception $e) {
fwrite(STDERR, "[错误] 数据库连接失败:" . $e->getMessage() . "\n");
exit(1);
}
// 查出所有 DATETIME / TIMESTAMP 列
$stmt = $pdo->prepare(
"SELECT TABLE_NAME, COLUMN_NAME, IS_NULLABLE, COLUMN_DEFAULT, EXTRA
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = ? AND DATA_TYPE IN ('datetime', 'timestamp')
ORDER BY TABLE_NAME, ORDINAL_POSITION"
);
$stmt->execute([$dbname]);
$cols = $stmt->fetchAll();
if (!$cols) {
echo "未发现需要转换的 DATETIME/TIMESTAMP 字段。\n";
exit(0);
}
$converted = 0;
foreach ($cols as $col) {
$table = $col['TABLE_NAME'];
$name = $col['COLUMN_NAME'];
$nullable = $col['IS_NULLABLE'] === 'YES' ? 'NULL' : 'NOT NULL';
// 原默认值为 CURRENT_TIMESTAMP / on update CURRENT_TIMESTAMP 的,改为 (CURRENT_DATE)
$def = 'NULL';
if (stripos((string)$col['COLUMN_DEFAULT'], 'CURRENT_TIMESTAMP') !== false) {
$def = '(CURRENT_DATE)';
}
$extra = '';
if (stripos((string)$col['EXTRA'], 'on update') !== false) {
$extra = ' ON UPDATE (CURRENT_DATE)';
}
$sql = "ALTER TABLE `$table` MODIFY COLUMN `$name` DATE $nullable DEFAULT $def$extra";
try {
$pdo->exec($sql);
echo "转换:$table.$name DATETIME -> DATE\n";
$converted++;
} catch (Exception $e) {
fwrite(STDERR, "[跳过] $table.$name:" . $e->getMessage() . "\n");
}
}
echo "完成:共转换 $converted / " . count($cols) . " 个时间字段。\n";