SQL:当值看起来像日期时排序

时间:2016-07-06 13:42:24

标签: mysql sql-order-by

Table  :
Value:
gte
2016-06-07
aze
2015-07-08
(...)

重要: 值存储Varchar(因为它可以是字符串,数字,日期等...)

我需要“排序”看起来像日期的值 我想象的东西是什么?

ORDER BY (value LIKE "%Y-%m-%d") DESC

3 个答案:

答案 0 :(得分:0)

如果日期格式为您描述为 YYYY-MM-DD ,则只需删除 - 分隔符即可。然后它可以按字母顺序排序为数字顺序。

尝试类似

的内容
SELECT *
FROM Table
ORDER BY REPLACE(Value,'-','') DESC

答案 1 :(得分:0)

如果您尝试将其转换为日期,则其他无日期值将为null

示例

mysql> mysql> select STR_TO_DATE('5/15/2012 8:06:26 AM','%c/%e/%Y %r');
+---------------------------------------------------+
| STR_TO_DATE('5/15/2012 8:06:26 AM','%c/%e/%Y %r') |
+---------------------------------------------------+
| 2012-05-15 08:06:26                               |
+---------------------------------------------------+
1 row in set (0.00 sec)

mysql> select STR_TO_DATE('dfsddfs','%c/%e/%Y %r');
+--------------------------------------+
| STR_TO_DATE('dfsddfs','%c/%e/%Y %r') |
+--------------------------------------+
| NULL                                 |
+--------------------------------------+
1 row in set, 1 warning (0.00 sec)

第一次尝试将其转换为日期并获得非空结果和使用ORDER BY的排序

SELECT * FROM (SELECT STR_TO_DATE(value, "%Y-%e-%c") AS DT FROM TABLE) T WHERE T.DT IS NOT NULL ORDER BY DT;

答案 2 :(得分:0)

这应该通过将所有“看日期”值放在顶部来订购记录集。它在“LIKE”子句中使用RegEx模式:

SELECT * FROM (

SELECT VALUE,
case when VALUE LIKE '[0-9]{4}-[0-9]{2}-[0-9]{2}' then 1 else 0 END AS LOOKS_LIKE_DATE
FROM TABLE

) ORDER BY LOOKS_LIKE_DATE DESC
相关问题