订购日期错误

sko*_*ind 0 mysql

我知道已经有一些关于SO的问题,但我找不到正确的答案.

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

SELECT id, header, date FROM table ORDER BY date DESC
Run Code Online (Sandbox Code Playgroud)

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

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

奇怪的结果是我得到4x30-08-2012 ..然后很多旧的约会,但突然有13个2012年的2记录.

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

UPDATE

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

Jon*_*eet 5

juergen给出了一个答案,基本上涉及每次解析的日期.另外两个选择建议自己:

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

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

第一个选择肯定是首选的IMO.这超出了订购范围,达到:

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