Table :
Value:
gte
2016-06-07
aze
2015-07-08
(...)
重要: Value存储VARCHAR(因为它可以是一个字符串,数字,日期等)SQL:排序当值看起来像一个日期
我需要“之类的通过“看起来像一个日期的价值 我想像这样的东西?
ORDER BY (value LIKE "%Y-%m-%d") DESC
Table :
Value:
gte
2016-06-07
aze
2015-07-08
(...)
重要: Value存储VARCHAR(因为它可以是一个字符串,数字,日期等)SQL:排序当值看起来像一个日期
我需要“之类的通过“看起来像一个日期的价值 我想像这样的东西?
ORDER BY (value LIKE "%Y-%m-%d") DESC
如果你形容为YYYY-MM-DD日期的格式,你只需要删除 - 分离器。然后它可以按数字顺序排序为一个字符串。
尝试像
SELECT *
FROM Table
ORDER BY REPLACE(Value,'-','') DESC
这不是他想要的东西 –
问题是该值可以是任何值(包括数字或带“ - ”的字符串)。所以它不仅会匹配“看起来像”日期的值。 –
如果你试图将其转换为日期,你会得到空的莫属日期值
例如
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;
这应该通过将所有“看起来日期”的值放在顶部来订购记录集。它使用正则表达式的“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
你应该想想你的数据库设计 – Jens
我不能,因为这是从CMS模块... –