为什么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'
然后我看到我创建的记录。我认为一个跟踪的时间是微秒,而另一个是几秒钟,但我找不到任何关于此的文档!这两者之间的转换是什么?
答案 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时间不适合你。