文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


B.3.4.2 使用 DATE 列的问题

DATE 值的格式为 'YYYY-MM-DD'。根据标准 SQL,不允许使用其他格式。您应该在 UPDATE 表达式以及 SELECT 语句的 WHERE 子句中使用此格式。例如

SELECT * FROM t1 WHERE date >= '2003-05-05';

为了方便起见,MySQL 会在数字上下文中使用日期时自动将日期转换为数字,反之亦然。MySQL 还允许在更新以及比较日期与 DATEDATETIMETIMESTAMP 列的 WHERE 子句中使用“放宽”的字符串格式。“放宽”格式意味着任何标点符号都可用作各部分之间的分隔符。例如,'2004-08-15''2004#08#15' 等效。MySQL 还可以转换包含没有分隔符的字符串(例如 '20040815'),只要它在日期上是合理的。

当您使用 <<==>=>BETWEEN 运算符将 DATETIMEDATETIMETIMESTAMP 与常量字符串进行比较时,MySQL 通常会将该字符串转换为内部长整型,以便更快地进行比较(以及进行更“放宽”的字符串检查)。但是,此转换会受到以下例外情况的影响

  • 当您比较两个列时

  • 当您将 DATETIMEDATETIMETIMESTAMP 列与表达式进行比较时

  • 当您使用除上述列出的任何比较方法之外的任何比较方法时,例如 INSTRCMP()

对于这些例外情况,比较是通过将对象转换为字符串并执行字符串比较来完成的。

为了保险起见,请假设字符串按字符串进行比较,如果您想将时间值与字符串进行比较,请使用相应的字符串函数。

特殊的“零”日期 '0000-00-00' 可以存储和检索为 '0000-00-00'。当 '0000-00-00' 日期通过 Connector/ODBC 使用时,它会自动转换为 NULL,因为 ODBC 无法处理这种日期。

由于 MySQL 执行了上述转换,因此以下语句有效(假设 idateDATE 列)

INSERT INTO t1 (idate) VALUES (19970505);
INSERT INTO t1 (idate) VALUES ('19970505');
INSERT INTO t1 (idate) VALUES ('97-05-05');
INSERT INTO t1 (idate) VALUES ('1997.05.05');
INSERT INTO t1 (idate) VALUES ('1997 05 05');
INSERT INTO t1 (idate) VALUES ('0000-00-00');

SELECT idate FROM t1 WHERE idate >= '1997-05-05';
SELECT idate FROM t1 WHERE idate >= 19970505;
SELECT MOD(idate,100) FROM t1 WHERE idate >= 19970505;
SELECT idate FROM t1 WHERE idate >= '19970505';

但是,以下语句无效

SELECT idate FROM t1 WHERE STRCMP(idate,'20030505')=0;

STRCMP() 是一个字符串函数,因此它会将 idate 转换为 'YYYY-MM-DD' 格式的字符串,并执行字符串比较。它不会将 '20030505' 转换为日期 '2003-05-05' 并执行日期比较。

如果您启用了 ALLOW_INVALID_DATES SQL 模式,MySQL 允许您存储只进行有限检查的日期:MySQL 只要求日期在 1 到 31 之间,月份在 1 到 12 之间。这使得 MySQL 非常适合 Web 应用程序,在这些应用程序中,您可以在三个不同的字段中获取年、月和日,并希望存储用户插入的精确内容(不进行日期验证)。

MySQL 允许您存储日期,其中日或月和日为零。如果您想将生日存储在 DATE 列中,并且您只知道日期的一部分,这将很方便。要禁止日期中出现零月份或零日部分,请启用 NO_ZERO_IN_DATE 模式。

MySQL 允许您将“零”值 '0000-00-00' 存储为“虚拟日期”。在某些情况下,这比使用 NULL 值更方便。如果要存储在 DATE 列中的日期无法转换为任何合理的值,MySQL 会存储 '0000-00-00'。要禁止使用 '0000-00-00',请启用 NO_ZERO_DATE 模式。

要让 MySQL 检查所有日期并只接受合法日期(除非被 IGNORE 覆盖),请将 sql_mode 系统变量设置为 "NO_ZERO_IN_DATE,NO_ZERO_DATE"