我想按日期订购。
e.g。
table_date
February 2011
January 2011
December 2010
我已经尝试过了:
SELECT distinct(table_date) FROM tables ORDER BY table_date DESC
bur它不起作用。
我得到了这个:
January 2011
February 2011
December 2010
你能帮我吗?
答案 0 :(得分:10)
如果您必须将日期保存在varchar
中,而其他人指出不建议使用,则可以使用:
SELECT table_date FROM tables ORDER BY STR_TO_DATE(table_date, '%M %Y') DESC;
答案 1 :(得分:8)
如果您想按日期订购,将其存储为日期,而不是字符串。除非您的日期字符串的格式为yyyy-mm-dd
,否则它不会按您的意愿排序
数据库很难按原样工作,没有人会让它变得更难,你应该尽可能地努力避免我喜欢称之为 SQL体操。
将其存储为日期,如果必须,请使用日期函数以February 2011
形式获取。
这样做比你想要做的容易得多。
即使由于代码限制无法更改任何当前列,您也可以始终向数据库添加另一列,如TABLE_DATE_AS_DATE
并插入插入/更新触发器根据{{1}}填充它。
然后就这样做:
TABLE-DATE
或类似的东西,为所有行触发触发器。
然后,您的查询仍可以update table x set table_date = table_date
获取,但可以使用table_date
进行排序。这当然是一个障碍,但过去我必须使用类似的技巧,因为代码无法改变,所以我们不得不诉诸DBMS技巧。
答案 2 :(得分:6)
将日期存储为DATE,而非VARCHAR,这是一个巨大的错误。使用STR_TO_DATE()转换您的内容。完成后,您可以按日期排序,没有任何问题。
答案 3 :(得分:4)
日期应存储为日期而不是VARCHAR.
假设您使用以下格式table_date
(DD-MM-YYYY)
table_date
2011-01-01
2011-02-01
2010-12-01
现在您可以按以下方式执行order by子句
SELECT * FROM table_order ORDER BY str_to_date(date, "%Y-%M-%D") ASC
我怀疑输出是否是有序的