1

我正在尝试将存储在 mysql 数据库中的日期转换为 VARCHAR(格式示例:2012 年 12 月 29 日),然后我想按它排序,以便旧日期在最前面,然后是当前日期。

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";
?>
4

2 回答 2

2

正如评论已向您表明的那样。您真的应该将字段类型更改为datedatetime(如果您需要 HMS 信息)。虽然您当然可以对文本类型字段中的日期值进行字符串操作,但您将无法使用索引来使您可能希望对该字段有效的过滤/排序/分组。

如果您需要帮助转换我可能会建议这种方法。添加新的日期或日期时间列。确保在此列上添加索引,因为您将使用它进行排序。

然后运行这个查询:

UPDATE table SET new_date_column = STR_TO_DATE(old_date_column, '%m-%d-%Y');

然后从表中删除旧列。

于 2012-11-28T19:59:50.970 回答
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

或类似的东西。这是我头顶上的飞行,但我认为它是准确的。如果没有按预期工作,请查找功能以了解其用法。

于 2012-11-28T20:16:27.197 回答