2010-05-15 42 views
2

为什么PHP time()函数生成的时间戳与SQL datetime不同?PHP时间和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

你正在使用什么sql数据库? – 2010-05-15 22:12:01

+0

嗨,即时通讯使用MySql 5.1.36 – Ying 2010-05-15 22:59:19

回答

7

time()函数不会返回微秒,所以如果您使用正确的数据类型,它应该可以工作。但是,您现在有两种不同的数据类型,INT和日期字段(可能为DATE/DATETIME/TIMESTAMP)。如果你想在数据库中的日期比较时间戳为整数,你可以使用类似:

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

谢谢!这是我一直在寻找的。 – Ying 2010-05-15 22:57:55

+1

是的。还要考虑PHP服务器的时钟与MySql服务器的时钟不同 - 这可能会导致问题。特别是如果他们在不同的时区或不同的DST设置。考虑让*所有内容都采用UTC格式。请注意,UNIX_TIMESTAMP不是UTC,而是MySql-local。 – johntellsall 2010-05-15 23:27:39

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()

+0

谢谢。我需要在特定的日期指定它,但不仅仅是现在() – Ying 2010-05-15 22:57:35

1

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

SELECT UNIX_TIMESTAMP(FIELD_NAME)FROM ...

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

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

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

相关问题