2010-05-15 46 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時間不適合你。

相關問題