0

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

我正在尝试按如下格式的日期订购:01-01-1999。我的查询如下所示:

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

我得到了 4 行,看起来还不错,(它们是一样的),但后来我得到了一些奇怪的结果。

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

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

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

更新

问题已经解决了。但仍然:我会为我的日期使用什么数据字段而不是 VARCHAR?

4

3 回答 3

5

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

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

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

第一个选项绝对是 IMO 的首选。这超出了订购的范围,还可以:

  • 验证(嗯,希望如此;我认为 MySQL 对无效数据的容忍度比我个人喜欢的要高,但是......)
  • 转换:我不确定 PHP 支持是什么样的,但一般来说,您应该能够向/从数据库发送和接收日期/时间值,而无需将它们转换为字符串,这样可以消除容易出错的转换
  • 目的明确:为检查数据库的任何人提供尽可能多的帮助。无论您对数据了解多少,都将其放入架构中。如果您将所有内容都存储为 varchar,无论是文本、数字还是日期/时间数据,您不妨说“好吧,这只是一些东西
于 2012-08-19T18:11:55.260 回答
4

尝试

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

STR_TO_DATE

于 2012-08-19T18:09:20.460 回答
0

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

于 2012-08-19T18:14:10.797 回答