日期值的SQL数据截断

时间:2019-04-03 20:02:21

标签: sql

我很难创建一个简单的表:

CREATE TABLE `csat` (
    `csat_id` INT NOT NULL AUTO_INCREMENT,
    `value` INT,
    `month` DATE NOT NULL,
    PRIMARY KEY (`csat_id`)
);

CREATE TABLE `migrated` (
    `migrated_id` INT NOT NULL AUTO_INCREMENT,
    `title` INT,
    `description` INT,
    `month` DATE NOT NULL,
    PRIMARY KEY (`migrated_id`)
);

INSERT INTO csat
VALUES (1, 1, 2017-06-15);

INSERT INTO migrated
VALUES (1, 2, 2018-06-15);

我得到了错误:     数据截断:错误的日期值:第1行的“月”列的日期为“ 1996”

看来我的约会日期格式正确: https://www.w3schools.com/sql/func_mysql_date.asp

我还想知道为什么我需要在csat_id上指定一个值,因为我认为SQL会因为它的主键而将它代入我。

3 个答案:

答案 0 :(得分:3)

您必须将日期值用单引号引起来:'2017-06-15',而不是2017-06-15。目前,MySQL将其评估为2017 minus 6 minus 15,该字词出现在1996年。

此外,在插入时,最好指定要插入的列。而且,如果您将列设置为AUTO_INCREMENT,则无需指定它:

INSERT INTO csat
(`value`, `month`)
VALUES 
(1, '2017-06-15');

我还将考虑更改您的列名。也许使“值”更具描述性(什么值?),month却具有误导性,因为它实际上是一个日期类型的列。

答案 1 :(得分:1)

您尚未说出正在使用哪个数据库服务器,但是通常来说日期是作为字符串输入的。

您应该尝试以下插入内容;

INSERT INTO csat (`csat_id`, `value`, `month`)
VALUES (1, 1, '2017-06-15');

INSERT INTO migrated (`migrated_id`, `title`, `description`, `month`)
VALUES (1, 2, 2, '2018-06-15');

此外,您还应该指定要插入的列。这样可以防止将数据输入错误的字段,尤其是在发生架构更改时。

SQL会自动递增主键字段(如果以此方式定义)。但是,由于没有指定要插入的列,因此必须在insert语句中定义它。

试试看;

INSERT INTO csat (`value`, `month`)
VALUES (1, '2017-06-15');

INSERT INTO migrated (`title`, `description`, `month`)
VALUES (2, 2, '2018-06-15');

答案 2 :(得分:1)

我想您首先在日期中错过了单个qoutes(根据Sql标准),然后在插入时即使该列是自动增量的,也需要指定除autoincrement列之外的其他列,以确保您所需要的数据插入是否属于该特定列 试试这个

INSERT INTO 
  csat(value,month) values 
  (1,'2017-06-15')