# B.3.4.2 使用 DATE 列的问题

的格式日期值为'*YYYY-MM-DD*'.根据标准 SQL,不允许使用其他格式。您应该在更新表达式和在在哪里的子句选择陈述。例如:

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

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

当你比较一个日期,时间,约会时间, 要么时间戳到一个常量字符串<,<=,=,>=,>, 要么之间运算符,MySQL 通常将字符串转换为内部长整数以便更快地比较(以及更“宽松”的字符串检查)。但是,这种转换有以下例外情况:

  • 当您比较两列时

  • 当你比较一个日期, 时间, 约会时间, 要么时间戳列到表达式

  • 当您使用刚刚列出的比较方法以外的任何比较方法时,例如要么STRCMP().

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

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

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

    因为 MySQL 执行刚刚描述的转换,所以以下语句有效(假设识别是一个日期柱子):

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()是一个字符串函数,所以它转换识别到一个字符串'*YYYY-MM-DD*'格式化并执行字符串比较。它不转换'20030505'到日期'2003-05-05'并进行日期比较。

如果启用ALLOW_INVALID_DATESSQL 模式,MySQL 允许您存储仅进行有限检查的日期:MySQL 只要求日期在 1 到 31 的范围内,月份在 1 到 12 的范围内。这使得 MySQL 对于 Web 应用程序非常方便您在三个不同的字段中获得年、月和日,并且您希望准确存储用户插入的内容(没有日期验证)。

MySQL 允许您存储日期或月份和日期为零的日期。如果您想将出生日期存储在日期列,您只知道部分日期。要禁止日期中的零月或日部分,请启用没有零年的约会模式

MySQL允许您存储'0000-00-00'作为“虚拟约会”在某些情况下,这比使用更方便无效的价值观如果要将日期存储在日期列无法转换为任何合理的值,MySQL存储'0000-00-00'.不允许'0000-00-00',启用没有约会模式

让MySQL检查所有日期,只接受合法日期(除非忽视),设置sql_模式系统变量到“没有日期,没有日期”.