按日期排序(varchar)?

Jon*_*han 2 mysql

我想按日期订购.

例如

table_date
February 2011
January 2011
December 2010
Run Code Online (Sandbox Code Playgroud)

我已经尝试过了:

SELECT distinct(table_date) FROM tables ORDER BY table_date DESC
Run Code Online (Sandbox Code Playgroud)

bur它不起作用.

我得到了这个:

January 2011
February 2011
December 2010
Run Code Online (Sandbox Code Playgroud)

你能帮我吗?

Tom*_*mas 11

如果您必须将日期存储在varchar其他人不指出的日期中,您可以使用:

SELECT table_date FROM tables ORDER BY STR_TO_DATE(table_date, '%M %Y') DESC;
Run Code Online (Sandbox Code Playgroud)


pax*_*blo 8

如果您想按日期订购,请将其存储为日期,而不是字符串.除非您的日期字符串是表单yyyy-mm-dd,否则它不会按您的意愿排序.

数据库很难按原样工作,没有人让它变得更难,你应该尽可能地努力避免我喜欢称之为SQL体操的东西.

将其存储为日期,如果必须,请使用日期函数将其添加到表单中February 2011.

这样做比你想要做的容易得多.


即使由于代码限制而无法更改任何当前列,也可以始终向数据库添加另一列,TABLE_DATE_AS_DATE并插入插入/更新触发器以根据其填充它TABLE-DATE.

然后就做:

update table x set table_date = table_date
Run Code Online (Sandbox Code Playgroud)

或类似的东西,触发所有行的触发器.

然后,您的查询仍然可以进入,table_datetable_date_as_date用于订购.这当然是一个障碍,但我过去必须使用这样的技巧,因为代码无法改变,所以我们不得不诉诸DBMS技巧.


Fra*_*ens 6

将日期存储为DATE,而不是VARCHAR,这是一个巨大的错误.使用STR_TO_DATE()转换您的内容.完成后,您可以按日期排序,没有任何问题.


sgo*_*les 6

日期应存储为日期而不是 VARCHAR.

假设你有table_date以下格式(DD-MM-YYYY)

table_date  
2011-01-01 
2011-02-01   
2010-12-01  
Run Code Online (Sandbox Code Playgroud)

现在您可以通过以下方式执行 order by 子句

SELECT * FROM table_order ORDER BY str_to_date(date, "%Y-%M-%D") ASC  
Run Code Online (Sandbox Code Playgroud)

我怀疑输出是否是有序的