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

重要: Value存储VARCHAR(因为它可以是一个字符串,数字,日期等)SQL:排序当值看起来像一个日期

我需要“之类的通过“看起来像一个日期的价值 我想像这样的东西?

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

你应该想想你的数据库设计 – Jens

+0

我不能,因为这是从CMS模块... –

回答

0

如果你形容为YYYY-MM-DD日期的格式,你只需要删除 - 分离器。然后它可以按数字顺序排序为一个字符串。

尝试像

SELECT * 
FROM Table 
ORDER BY REPLACE(Value,'-','') DESC 
+0

这不是他想要的东西 –

+0

问题是该值可以是任何值(包括数字或带“ - ”的字符串)。所以它不仅会匹配“看起来像”日期的值。 –

0

如果你试图将其转换为日期,你会得到空的莫属日期值

例如

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) 

1日尝试将其转换为日期并得到不为空的结果,并使用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; 
0

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

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 
相关问题