我正在尝试将存储在mysql数据库中的日期转换为VARCHAR(格式示例:12/29/2012),然后我想对它进行ORDER BY,以便旧日期位于顶部,然后是当前的日期。
Eg:
11-01-2012
11-05-2012
12-25-2012
...
这是我到目前为止所做的,(请帮助!!谢谢)
<?php
$listsql = "SELECT contact.id, CONCAT(lastname,', ',firstname) AS fullname, lastname, firstname,
STR_TO_DATE(daDATE,'%m-%d-%Y'), line1, line2, city, state, zip, phone1, phone2, country, whoAdded
FROM ". TABLE_CONTACT ." AS contact
LEFT JOIN ". TABLE_ADDRESS. " AS address ON contact.id=address.id AND contact.primaryAddType=address.type
LEFT JOIN ". TABLE_EMAIL ." AS email ON contact.id=email.id AND contact.primaryAddType=email.type
WHERE contact.hidden != 1
ORDER BY email.daDATE";
?>
答案 0 :(得分:2)
正如评论已向您表明的那样。您真的应该将字段类型更改为date
或datetime
(如果您需要H-M-S信息)。虽然您当然可以对文本类型字段中的日期值进行字符串操作,但您无法使用索引来对该字段进行有效的过滤/排序/分组。
如果您需要帮助转换,我可能会建议这种方法。添加新的日期或日期时间列。确保在此列上添加索引,因为您将使用它进行订购。
然后运行此查询:
UPDATE table SET new_date_column = STR_TO_DATE(old_date_column, '%m-%d-%Y');
然后从表中删除旧列。
答案 1 :(得分:0)
您可以使用SUBSTR()
和INSTR()
动态订购,以确定日期的每个部分,然后按年份排序,然后按月份排序。像其他人说的那样,最好将它存储为date
或unixtime整数。您可以将其更改为yyyy-mm-dd
,并且orderby可以原生工作。
如果你坚持最困难的方式,那就像(年,月,日):
ORDER BY SUBSTR(email.daDATE,INSTR(email.daDATE,'-',2)+1) DESC,
SUBSTR(email.daDATE,INSTR(email.daDATE,'-',1)+1,INSTR(email.daDATE,'-',2)-1) DESC,
SUBSTR(email.daDATE,0,INSTR(email.daDATE,'-')-1) DESC
或类似的东西。这是我头顶上的飞行,但我认为这是准确的。如果函数没有按预期工作,请查找它们的用法。