按日期排序(varchar)?

时间:2011-02-22 15:47:40

标签: mysql

我想按日期订购。

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

你能帮我吗?

4 个答案:

答案 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  

我怀疑输出是否是有序的