2011-06-19 45 views
0

当每个项目都进入我用下面的方法插入日期分贝:按时间排序的正确方法是什么?

date_default_timezone_set('America/New_York'); 
ob_start(); 
$createdon = date('l, F j, Y, h:i A'); 
ob_get_clean(); 

这个输出是这样的:

Tuesday, May 3, 2011, 04:50 PM 

这是查询:

select test_id, why_test, date_time 
    from the_test 
    where p_id = '$id' 
    UNION 
    select pencil_id, pencil_name, date_time 
    from pencils 
    where p_id = '$id' 
    ORDER BY 3 DESC 

现在,当我按功能使用订单时,它并没有正确执行。日期仍在混淆。我使用了date_time DESC命令。

我使用php/phpmyadmin。

任何想法?

+0

什么是你的表结构? 'SHOW CREATE TABLE tbl_name'并确保你将日期存储为TIMESTAMP或DATETIME字段 – JamesHalsall

+0

转换只会让我失去所有日期。 – AAA

+0

这是因为您已将日期作为字符串以PHP不能理解的格式存储。 PHP的标准日期/时间字符串格式是'YYYY-MM-DD HH:MM:SS'。由于'date_time'字段是一个字符串,因此PHP会将其内容作为一个字符串进行排序,这意味着十二月将在2月份之前到达 –

回答

6

将日期存储为字符串是错误的。您应该将日期存储为日期。

MySQL有一系列与日期和时间相关的适当类型;我建议使用TIMESTAMPDATETIME(可能是后者;请在手册中查看,看看最适合您的是什么)。

为避免丢失现有的数据,当您解决您的表结构:

  • 添加一个字段与正确的类型;
  • 更新表中的每一行以将数据复制到新字段,可能使用UNIX_TIMESTAMP函数—这是一次性副本,可能需要一些时间;
  • 删除旧字段并开始使用新字段。

ORDER BY将在这个领域自然发挥作用,因为您现在正在使用MySQL,因为它被设计用于使用。

+1

'TIMESTAMP'考虑到当前时区,并且可以在连接时区不同的情况下自动转换到服务器时区。 'DATETIME'不与时区保持关系。 – datasage

2

尝试

SELECT .... ORDER BY UNIX_TIMESTAMP(`date_time`) DESC 

的想法在这里,是将一个字符串转换为可排序的编号。如果你不熟悉unix时间戳,它是1970年1月1日以来的秒数,所以如果你可以把时间转换成那个时间,你可以得到一个比较时间的线性简单的方法。

但我相信MySQL的UNIX_TIMESTAMP()需要在格式的字符串:1970-01-01 00:00:00

但是,这个概念仍然存在,进入转弯日期(或甚至将其存储)作为UNIX时间戳或MySQL的本地日期类型,如datetimetimestamp

+0

@hexa嗨,谢谢!这工作,但它默认只有ASC时,我尝试DESC它不这样做。 – AAA

+0

使用“日期”而不是“日期”返回到旧问题。 – AAA

+0

@hexa:多么可怕的低效率的事情。 –

相关问题