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'
),只要它作为日期有意义即可。
当您使用 <
、<=
、=
、>=
、>
或 BETWEEN
运算符将 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 应用程序非常方便,并且您希望准确存储用户插入的内容(无需日期验证)。
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"
。