PHP时间和SQL时间有什么区别?

时间:2010-05-15 22:11:14

标签: php mysql datetime time

为什么PHP time()函数生成的时间戳与SQL日期时间有很大不同?

如果我在PHP中使用date('Y-m-d', time());,它会给我现在的时间,因为它应该。如果我只是采用time()部分并执行:

$now = time();
//then execute this statement 'SELECT * FROM `reservation` WHERE created_at < $now'

我一无所获。但是,嘿,所以如果$now的值是1273959833并且我查询了

  'SELECT * FROM `reservation` WHERE created_at < 127395983300000000'

然后我看到我创建的记录。我认为一个跟踪的时间是微秒,而另一个是几秒钟,但我找不到任何关于此的文档!这两者之间的转换是什么?

3 个答案:

答案 0 :(得分:7)

time()函数不会返回微秒,因此如果您使用的是正确的数据类型,它应该可以正常工作。但您现在有2种不同的数据类型,INT和日期字段(可以是DATE / DATETIME / TIMESTAMP)。如果要将数据库中的日期与时间戳作为整数进行比较,可以使用以下内容:

SELECT * FROM Tbl WHERE UNIX_TIMESTAMP(date) < $timestamp;

答案 1 :(得分:2)

time()给出一个Unix时间戳(自01-01-1970以来经过的秒数) - SQL希望格式为YYYY-mm-dd hh-ii-ss的时间戳由date()完成 - 所以如果你不想要要调用2个PHP函数,只需使用$now = date("Y-m-d H:i:s"),或者更好地将SQL查询更改为created_at < NOW()

答案 2 :(得分:1)

它们只是两种不同的存储日期方式,每种方式都有其优点和缺点。您可以使用MySQL的日期字段,或者只是在INT字段中存储unix时间戳。您也可以使用:

SELECT UNIX_TIMESTAMP(field_name)FROM ...

将日期字段作为Unix时间戳返回。

MySQL日期字段是人类可读的,可以在可预见的将来存储任何日期。但是,如果处理不当,它不会存储可能导致严重问题的时区信息。 Facebook有一段时间有这个问题。

Unix时间戳记存储时区信息(因为它被定义为1970年1月1日UTC时间以来的秒数)。整数上的比较操作更快,PHP的时间/日期函数设计用于Unix时间戳。但是,Linux只能支持从1902年到2038年以及从1970年到2038年在Windows上的日期。在2038年到来之前,MySQL和架构通常会切换到64位整数,但如果你需要存储遥远未来的日期或过去,Unix时间不适合你。