Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


B.3.4.2 使用 DATE 列的问题

DATE 列的格式是 'YYYY-MM-DD'。根据标准 SQL,不能使用其他格式。你应该在 UPDATE 表达式和 WHERE 子句中使用该格式。例如:

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

出于方便,MySQL 会自动将日期转换为数字,如果日期用于数字上下文,反之亦然。MySQL 还允许在更新和 WHERE 子句中使用“relaxed”字符串格式,该格式用于比较日期到 DATEDATETIMETIMESTAMP 列。“relaxed”格式意味着可以使用任何分隔符。例如,'2004-08-15''2004#08#15' 等价。MySQL 也可以将不包含分隔符的字符串(例如 '20040815')转换为日期,提供它是有意义的日期。

当你比较 DATETIMEDATETIMETIMESTAMP 到常量字符串使用 <<==>=>BETWEEN 运算符时,MySQL 通常将字符串转换为内部长整数,以加速比较(并且为一些“relaxed”字符串检查)。然而,这种转换有以下例外情况:

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

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

特殊的日期'0000-00-00'可以被存储和检索为'0000-00-00'.当使用Connector/ODBC时,'0000-00-00'日期将被自动转换为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_DATES SQL 模式,MySQL 允许您存储只进行有限检查的日期:MySQL 只要求日期的天数在 1 到 31 之间,月份在 1 到 12 之间。这使得 MySQL 对于 Web 应用程序非常方便,因为您可以在三个不同的字段中获取年、月和日,并且您想要存储用户输入的日期(不进行日期验证)。

MySQL 允许您存储日期,其中天或月和天为零。这在您想要存储出生日期在DATE列中,并且您知道部分日期时非常方便。要禁止在日期中使用零月或零天,启用NO_ZERO_IN_DATE 模式。

MySQL 允许您存储'0000-00-00'作为DATE列中的“dummy date.”这在某些情况下比使用NULL值更方便。如果要存储在DATE列中不能被转换为任何合理值,MySQL 将存储'0000-00-00'。要禁止'0000-00-00',启用NO_ZERO_DATE 模式。

要使 MySQL 检查所有日期并接受合法日期(除非被IGNOREoverride),将sql_mode系统变量设置为"NO_ZERO_IN_DATE,NO_ZERO_DATE"