专家,我发疯了...... 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的错误,但至少问题已解决。
答案 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;