Qt C++数据库增加列名是日期的列(增加1年)(曲线方法)
最新处理方法:一步到位,可以直接日期作为列名,加个'';详见:
效果:
原来的曲线方法:
1、首先,SQL语句对于列名的要求似乎是数字不可以作为列名的首字,比如20230608不可以作为列名,但是_20230608,年20230608,y20230608都是可以作为列名的;看这句:
是吧,SQL语句加20230202不行。
2、然后,如果真的想列名是20230608或者2023年06月08日这样子,那么可能只能用SQLiteStudio之类的可视化平台进行列名改进或者新添。(噢,我是db数据库,所以使用SQLiteStudio,中文免费可视化。如果是Navicat Premium的话,MySQL、SQLite(db/db3)等主流数据库都是可以使用的)。
3、日期列名的曲线添加:
既然已经不支持数字为首字的列名了,我们可以把列名加两个字母或者一个字母或者加下划线或者中文什么的没问题的,比如给它加个简写:”NB+年月日“这样子。如果是一定要数字开头,我也没规定,搞定的朋友捞捞我。
这是代码:
需要注意:(1)是否是闰年,还有大小月,比如今年2023年非闰年,二月小,28天。
(2)默认是从最后一行插入的。
void MainWindow::on_pushButton_29_clicked()
// 打开数据库连接
qDebug() << "Opening database...";
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("D:/Desktop/WTMS5.db");
if (!db.open()) {
qDebug() << "Error: connection with database fail";
return;
qDebug() << "Database opened.";
// 构造整年的日期列名
QStringList cols;
int year = QDate::currentDate().year();
// 遍历每个月
for (int month = 1; month <= 12; ++month)
// 获取月份天数
int days;
switch (month) {
case 2:
days = (year % 4 == 0) ? 29 : 28; // 闰年2月为29天
break;
case 4:
case 6:
case 9:
case 11:
days = 30;
break;
default:
days = 31;
// 遍历每个月的天数,构造列名
for (int day = 1; day <= days; ++day)
QString col = QString("NB2023年%1月%2日").arg(month).arg(day);
// 构造添加列的SQL语句
QString sql = "ALTER TABLE task_info ADD COLUMN " + col;
qDebug() << "SQL statement:" << sql;
// 执行添加列的语句
QSqlQuery query;
if (!query.exec(sql))
qDebug() << "Fail to add column.";
qDebug() << "Column added.";