订购日期错误

时间:2012-08-19 18:02:32

标签: mysql

我知道SO上已经存在一些问题,但我找不到正确的答案。

我正在尝试按照这样的形式订购日期:01-01-1999。我的查询如下:

SELECT id, header, date FROM table ORDER BY date DESC

我得到4行似乎没问题,(它们是相同的)但是后来我得到了一些奇怪的结果。

字段是VARCHAR(); - 将01-01-1999格式存储在哪个字段?

奇怪的结果是我得到了4x30-08-2012 ..然后是很多旧日期,但突然之间有3个13-09-2012的记录。

我的问题是:为什么不对它们进行排序:2x13-09-2012然后4x30-08-2012然后再继续。

更新

问题解决了。但仍然:我将使用哪个数据字段来代替我的日期而不是VARCHAR?

3 个答案:

答案 0 :(得分:5)

juergen给出了答案,该答案基本上涉及每次解析的日期。另外两种选择表明了自己:

  • 更改数据库架构,使列已经是日期类型(例如DATE)而不是字符串。当您使数据库列准确表示要存储在其中的数据类型时,生活往往要好得多。

  • 如果确实需要将数据存储在字符串列中,请考虑将格式更改为yyyy-MM-dd。这是一种自然可排序的格式,因为“字母”排序与日期的“语义”排序兼容。

第一个选择肯定是首选的IMO。这超出了订购范围,直至:

  • 验证(好吧,希望;我收集MySQL比我个人更喜欢无效数据,但是......)
  • 转换:我不确定PHP支持是什么样的,但一般来说,您应该能够向/从数据库发送和接收日期/时间值,而无需将它们转换为字符串,这可以消除容易出错的转换
  • 目的明确:尽可能向检查数据库的人提供帮助。无论您对数据有何了解,都可以将其放入模式中。如果您将所有内容存储为varchar,无论是文本,数字还是日期/时间数据,您都可以说“好吧,它只是一些东西

答案 1 :(得分:4)

SELECT id, header, date FROM table
ORDER BY str_to_date(date, '%d-%m-%Y') DESC

请参阅STR_TO_DATE

答案 2 :(得分:0)

在字符串中存储日期的最佳方法是“YYYY-MM-DD”。 MySQL具有日期的原生格式 - DATETIME