5

我在我的数据库中创建了一个表:

CREATE TABLE official_receipt(
    student_no INT UNSIGNED,
    academic_year CHAR(8),
    trimester ENUM('1', '2', '3'),
    or_no MEDIUMINT UNSIGNED,
    issue_date DATE NOT NULL,
    received_from VARCHAR(255) NOT NULL,
    amount_of DECIMAL(8,2) NOT NULL,
    issued_by VARCHAR(255),
    doc_type ENUM('FULL', 'DOWN', 'INST') NOT NULL,
    form_of_payment ENUM('CASH', 'INST') NOT NULL,
    PRIMARY KEY (student_no, academic_year, trimester, or_no)
);

我插入了一些值:

INSERT INTO official_receipt(student_no , academic_year, trimester, or_no, issue_date, received_from, amount_of, issued_by, doc_type, form_of_payment)
VALUES
    (201201121, 'AY201314', '1', 029940, 2013-05-21, 'NAME', 20000.00, NULL, 'DOWN', 'INST'),
    (201201121, 'AY201314', '1', 029944, 2013-07-23, 'NAME', 8000.00, NULL, 'INST', 'INST'),
    (201201101, 'AY201314', '1', 029941, 2013-05-21, 'NAME', 56650.00, NULL, 'FULL', 'CASH'),
    (201201037, 'AY201314', '1', 029942, 2013-05-21, 'NAME', 56650.00, NULL, 'FULL', 'CASH'),
    (201201142, 'AY201314', '1', 029943, 2013-05-21, 'NAME', 63800.00, NULL, 'FULL', 'CASH');

我收到此错误:

Error Code: 1292. Incorrect date value: '1987' for column 'issue_date' at row 1

我很困惑,因为我已经遵循了 YYYY-MM-DD 格式。有什么帮助吗?

4

3 回答 3

11

日期和时间文字下所述:

MySQL 可以识别DATE以下格式的值:

  • 作为一个'YYYY-MM-DD''YY-MM-DD'格式的字符串。允许使用“宽松”语法:任何标点符号都可以用作日期部分之间的分隔符。例如,'2012-12-31''2012/12/31''2012^12^31''2012@12@31'是等价的。

  • 作为在任何一种格式中都没有分隔符的'YYYYMMDD'字符串'YYMMDD',前提是该字符串作为日期有意义。例如,'20070523'and'070523'被解释为'2007-05-23', 但是'071332'是非法的(它有无意义的月份和日期部分)并且变成'0000-00-00'.

  • 作为任一YYYYMMDD格式YYMMDD的数字,前提是该数字作为日期有意义。例如19830905830905被解释为'1983-09-05'

因此,该表达式2013-05-21不是一个有效的 MySQL 日期文字(它实际上是一个算术表达式,由两个减法组成:它的结果是 integer 1987)。为了符合上面详述的文字格式之一,您必须将日期文字引用为字符串和/或删除分隔符。

于 2013-07-22T18:04:19.393 回答
4

您在我的测试值'周围缺少单引号,它成功插入记录issue_date

试试这个

INSERT INTO official_receipt(student_no , academic_year, trimester, or_no, issue_date, received_from, amount_of, issued_by, doc_type, form_of_payment)
VALUES
    (201201121, 'AY201314', '1', 029940, '2013-05-21', 'NAME', 20000.00, NULL, 'DOWN', 'INST'),
    (201201121, 'AY201314', '1', 029944, '2013-07-23', 'NAME', 8000.00, NULL, 'INST', 'INST'),
    (201201101, 'AY201314', '1', 029941, '2013-05-21', 'NAME', 56650.00, NULL, 'FULL', 'CASH'),
    (201201037, 'AY201314', '1', 029942, '2013-05-21', 'NAME', 56650.00, NULL, 'FULL', 'CASH'),
    (201201142, 'AY201314', '1', 029943, '2013-05-21', 'NAME', 63800.00, NULL, 'FULL', 'CASH');

这是你的小提琴

于 2013-07-22T17:54:54.290 回答
2

您需要将日期文字放在引号中。错误消息说1987,因为未引用的日期被读取为表达式2013 minus 5 minus 21,即1987.

您的日期可以是这样的:'2013-05-21'文档'20130521'中涵盖的其他几种格式。

于 2013-07-22T17:56:48.750 回答