6

您好我正在寻找以日期作为列名的表。

我正在使用此代码将列添加到表中:

DROP PROCEDURE IF EXISTS filldates;
DELIMITER |
CREATE PROCEDURE filldates(dateStart DATE, dateEnd DATE)
BEGIN
  WHILE dateStart <= dateEnd DO
    ALTER TABLE dates
    ADD dateStart VARCHAR(30);

    SET dateStart = date_add(dateStart, INTERVAL 1 DAY);
  END WHILE;
END;
|
DELIMITER ;
CALL filldates('2017-01-01','2017-12-31');

但它将错误 dateStart 显示为重复内容,因为它创建了一个列“dateStart”而不是日期。如何使用 dateStart 作为变量。

当我使用“INSERT INTO tablename (_date) VALUES (dateStart);” 而不是 ALTER TABLE 语句,它不显示任何错误,它正在将日期插入数据库,但作为 '_date' 列中的行。我希望将日期添加为列名。

如何使用 dateStart 作为变量

4

3 回答 3

10

简短的回答是,您不能在 MySQL 中将变量用作数据库、表或列名。

您唯一能做的就是将 sql 语句连接为字符串并将其作为准备好的语句执行。

SET @s=CONCAT('ALTER TABLE dates ADD COLUMN `',dateStart,'` VARCHAR(30)');
PREPARE stmt1 FROM @s;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;

但是,将大量字段名称动态地添加到表中通常表明设计不佳(除非您正在准备物化数据透视表以用于报告无法更改的数据)。

于 2017-05-08T13:53:24.647 回答
1

这将是您的表的添加列,但这不是一个好主意。

set @datestart = "2017-01-03";
set @sql = concat('Alter table tbl_1 Add Column `' ,@datestart, '`Varchar(30)');

PREPARE stmt from @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

如果你想要一个循环,那么使用Cursor

于 2017-05-09T01:54:39.480 回答
0

我有同样的问题,这对我有用。

declare @colname varchar (128)
set @colname=convert(varchar,DATEPART(DAY,GetDate()))+'\'+convert(varchar,DATEPART(MONTH,GetDate()))+convert(varchar,DATEPART(YYYY,GetDate()))
exec ('ALTER TABLE temp ADD ['+@colname +'] int NULL')
于 2021-02-16T15:28:17.063 回答