#### B.3.4.2 使用 DATE 列的问题

[](<>)[](<>)[](<>)

的格式[`日期`](datetime.html)值为`'*`YYYY-MM-DD`*'`.根据标准 SQL，不允许使用其他格式。您应该在[`更新`](update.html)表达式和在`在哪里`的子句[`选择`](select.html)陈述。例如：

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

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

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

-   当您比较两列时

-   当你比较一个[`日期`](datetime.html), [`时间`](time.html), [`约会时间`](datetime.html)， 要么[`时间戳`](datetime.html)列到表达式

-   当您使用刚刚列出的比较方法以外的任何比较方法时，例如`在`要么[`STRCMP()`](string-comparison-functions.html#function_strcmp).

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

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

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

    因为 MySQL 执行刚刚描述的转换，所以以下语句有效（假设`识别`是一个[`日期`](datetime.html)柱子）：


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

如果启用[`ALLOW_INVALID_DATES`](sql-mode.html#sqlmode_allow_invalid_dates)SQL 模式，MySQL 允许您存储仅进行有限检查的日期：MySQL 只要求日期在 1 到 31 的范围内，月份在 1 到 12 的范围内。这使得 MySQL 对于 Web 应用程序非常方便您在三个不同的字段中获得年、月和日，并且您希望准确存储用户插入的内容（没有日期验证）。

MySQL 允许您存储日期或月份和日期为零的日期。如果您想将出生日期存储在[`日期`](datetime.html)列，您只知道部分日期。要禁止日期中的零月或日部分，请启用[`没有零年的约会`](sql-mode.html#sqlmode_no_zero_in_date)模式

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

让MySQL检查所有日期，只接受合法日期（除非`忽视`)，设置[`sql_模式`](server-system-variables.html#sysvar_sql_mode)系统变量到`“没有日期，没有日期”`.
