PHP和; MySQL STR_TO_DATE

时间:2012-11-28 19:54:02

标签: php mysql sql-date-functions

我正在尝试将存储在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";
?>

2 个答案:

答案 0 :(得分:2)

正如评论已向您表明的那样。您真的应该将字段类型更改为datedatetime(如果您需要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

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