Documentation Home

B.3.4.2 使用 DATE 列的问题

值的格式DATE是 . 根据标准 SQL,不允许使用其他格式。您应该在表达式和语句的 子句中 使用这种格式 。例如: 'YYYY-MM-DD'UPDATEWHERESELECT

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

为方便起见,如果日期用于数字上下文,MySQL 会自动将日期转换为数字,反之亦然。MySQL 还允许在更新时以及在将日期与, 或 列 进行比较的子句中使用宽松的字符串格式。宽松格式是指任何标点符号都可以用作各部分之间的分隔符。例如,和 是等价的。MySQL 还可以转换不包含分隔符(例如 )的字符串,只要它作为日期有意义。 WHEREDATEDATETIMETIMESTAMP'2004-08-15''2004#08#15''20040815'

当您使用, , , , 或运算符将DATE, TIME, DATETIMETIMESTAMP与常量字符串进行比较时 ,MySQL 通常会将字符串转换为内部长整数以进行更快的比较(以及更 宽松的字符串检查)。但是,此转换受以下例外情况的约束: <<==>=>BETWEEN

  • 比较两列时

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

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

对于那些异常,比较是通过将对象转换为字符串并执行字符串比较来完成的。

为了安全起见,假设将字符串作为字符串进行比较,如果要将时间值与字符串进行比较,请使用适当的字符串函数。

特殊的日期 '0000-00-00'可以存储和检索为 '0000-00-00'.'0000-00-00'通过连接器/ODBC 使用日期时,它会自动转换为, NULL因为 ODBC 无法处理那种日期。

因为 MySQL 执行刚刚描述的转换,所以以下语句有效(假设它 idate是一 DATE列):

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_DATESSQL模式,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"