DATE 值的格式是 '。根据标准 SQL,无其他格式被允许。在 YYYY-MM-DD'UPDATE 表达式和 SELECT 语句的 WHERE 子句中,您应该使用此格式。例如:
SELECT * FROM t1 WHERE date >= '2003-05-05';
出于方便,MySQL 会自动将日期转换为数字,如果日期在数字上下文中使用,反之亦然。MySQL 还允许在更新和 WHERE 子句中使用“松散”字符串格式来比较日期与 DATE、DATETIME 或 TIMESTAMP 列。“松散”格式意味着可以使用任何标点符号作为分隔符。例如,'2004-08-15' 和 '2004#08#15' 是等效的。MySQL 还可以将不包含分隔符的字符串(例如 '20040815')转换为日期,只要它作为日期是有意义的。
当您比较 DATE、TIME、DATETIME 或 TIMESTAMP 与常量字符串时,MySQL 通常将字符串转换为内部长整数,以便进行更快的比较(也用于更“松散”的字符串检查)。但是,这种转换有以下例外情况:
对于这些例外情况,比较是通过将对象转换为字符串并执行字符串比较来完成的。
为了安全起见,假设字符串是作为字符串比较的,并使用适当的字符串函数,如果您想比较时间值与字符串。
特殊的“零”日期 '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 应用程序,其中您从三个不同的字段中获取年、月和日,并想存储用户输入的 exact 日期(无日期验证)。
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"。