Files
superlink/tools/migrate_time_to_date.php
T
nanguaboss 2cb688ed46 0806
2026-08-06 00:50:23 +08:00

68 lines
2.5 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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";