str_to_date不起作用

时间:2017-09-20 21:43:13

标签: mysql sql

专家,我发疯了...... str_to_date赢了工作

mysql> describe product_tbl;
+--------------------+-------------+------+-----+---------+----------------+
| Field              | Type        | Null | Key | Default | Extra          |
+--------------------+-------------+------+-----+---------+----------------+
| product_id         | int(11)     | NO   | PRI | NULL    | auto_increment |
| ...                | ...         | ...  | ... | ...     | ...            |
| expiration_date    | text        | YES  |     | NULL    |                |
+--------------------+-------------+------+-----+---------+----------------+

日期格式为第01-31天 - 第01-12个月 - 第4年

mysql> select expiration_date from product_tbl limit 2;
+-----------------+
| expiration_date |
+-----------------+
| 26-09-2017      |
| 19-09-2017      |
+-----------------+
2 rows in set (0.00 sec)

根据dev.mysql.com的文件:

%d - >每月的某天,数字(00..31)

%m - >月,数字(00..12)

%Y - >年份,数字,四位数

但是...

mysql> select STR_TO_DATE(expiration_date, '%d-%m-%Y') from product_tbl limit 2;
+------------------------------------------+
| STR_TO_DATE(expiration_date, '%d-%m-%Y') |
+------------------------------------------+
| NULL                                     |
| NULL                                     |
+------------------------------------------+
2 rows in set, 2 warnings (0.00 sec)

我做错了什么?帮助赞赏!

回答你的问题:

没有LIMIT:

mysql> select expiration_date, STR_TO_DATE(expiration_date, '%d-%m-%Y') from product_tbl;
+-----------------+------------------------------------------+
| expiration_date | STR_TO_DATE(expiration_date, '%d-%m-%Y') |
+-----------------+------------------------------------------+
| 26-09-2017      | NULL                                     |
| 19-09-2017      | NULL                                     |
| 20-09-2017      | NULL                                     |
| 19-09-2017      | NULL                                     |
| 19-09-2017      | NULL                                     |
| 19-09-2017      | NULL                                     |
| 19-09-2017      | NULL                                     |
| 19-09-2017      | NULL                                     |
| 19-09-2017      | NULL                                     |
| 19-09-2017      | NULL                                     |
| ...             | ...                                      |

依此类推到桌子的最后。

另外,

mysql> SELECT STR_TO_DATE(expiration_date, '%d-%m-%Y')
    ->   FROM product_tbl
    ->  WHERE expiration_date IS NOT NULL
    ->  LIMIT 2;
+------------------------------------------+
| STR_TO_DATE(expiration_date, '%d-%m-%Y') |
+------------------------------------------+
| NULL                                     |
| NULL                                     |
+------------------------------------------+
2 rows in set, 2 warnings (0.01 sec)

mysql> SELECT STR_TO_DATE(expiration_date, '%d-%m-%Y')
    ->   FROM product_tbl
    ->  ORDER BY expiration_date DESC
    ->  LIMIT 2;
+------------------------------------------+
| STR_TO_DATE(expiration_date, '%d-%m-%Y') |
+------------------------------------------+
| NULL                                     |
| NULL                                     |
+------------------------------------------+
2 rows in set, 2 warnings (0.00 sec)

顺便说一下,Server版本是5.6.37 MySQL社区服务器(GPL)

编辑:

mysql> select expiration_date, CAST(expiration_date AS DATE), STR_TO_DATE(expiration_date, '%d-%m-%Y') from product_tbl;
+-----------------+-------------------------------+------------------------------------------+
| expiration_date | CAST(expiration_date AS DATE) | STR_TO_DATE(expiration_date, '%d-%m-%Y') |
+-----------------+-------------------------------+------------------------------------------+
| 26-09-2017      | NULL                          | NULL                                     |
| 21-09-2017      | NULL                          | NULL                                     |
| 21-09-2017      | NULL                          | NULL                                     |
| 21-09-2017      | NULL                          | NULL                                     |
| 23-09-2017      | NULL                          | NULL                                     |
| 28-09-2017      | NULL                          | NULL                                     |
| 27-09-2017      | NULL                          | NULL                                     |
| 21-09-2017      | NULL                          | NULL                                     |
| 21-09-2017      | NULL                          | NULL                                     |
| 21-09-2017      | NULL                          | NULL                                     |
| 21-09-2017      | NULL                          | NULL                                     |

我怀疑我的数据库安装有问题,因为在另一台运行MariaDB 5.5.52日期的服务器上正确返回。

我尝试卸载并重新安装MySQL服务器但结果相同。 我现在要更改存储库并安装其他版本。

我会告诉你的。 无论如何,谢谢你的支持。

编辑:

只是为了让您知道我删除了MySQL社区服务器5.6.37并安装了MariaDB 10.1.26。现在它就像一个魅力。 不确定这是否是MySQL的错误,但至少问题已解决。

1 个答案:

答案 0 :(得分:0)

如草莓所述,您可能会获得具有NULL值的随机记录

  

没有ORDER BY的LIMIT是毫无意义的

您可以检查是否有使用这些查询的记录。

SELECT STR_TO_DATE(expiration_date, '%d-%m-%Y') 
  FROM product_tbl
 WHERE expiration_date IS NOT NULL
 LIMIT 2;

或者

SELECT STR_TO_DATE(expiration_date, '%d-%m-%Y') 
  FROM product_tbl
 ORDER BY expiration_date DESC
 LIMIT 2;