2013-08-22 29 views
0

剛剛繼承了一個錯誤填充的網站,其中包含日期和事件出現/消失時的一些問題。使用CURRENT_DATE的不準確的MySQL舊版代碼

有很多SQL語句使用CURRENT_DATE,我相信這可能是一個可能的問題。

超過使用CURRENT_DATE誰都知道任何不準確的表現,說PHP衍生日期字符串如date('Y-m-d H:j',time())

+0

CURRENT_DATE返回一個日期;你的PHP表達式是以時間戳的形式出現的。如果你使用其中一種,那麼你就會遇到麻煩。 –

+0

PHP表達式將時間戳轉換爲由第一個參數定義的日期。 – rmccallum

+0

不,它不。 PHP表達式'echo date('Y-m-d H:j',time())'在這裏剛剛返回了'2013-08-22 07:22'。在數據庫術語中,這是一個時間戳,而不是日期。 'CURRENT_DATE'評估爲'2013-08-22'。 –

回答

0

有幾個方面是比較日期可能會出錯。他們中沒有一個與CURRENT_DATE有關,CURRENT_DATE具有標準的,明確的,一致的行爲。

首先,php通常在Web服務器上執行; CURRENT_DATE在數據庫服務器上執行。有時Web服務器和數據庫服務器是同一臺機器,但有時它們不是。兩個不同的服務器可能會使用不匹配的時鐘進行操作。至少在理論上,Web服務器和數據庫服務器可以處於(或被設置爲)兩個不同的時區。我從來沒有見過這樣的服務器,但它是可能的。

二,your PHP expression returns a string(不是日期)以時間戳的形式(不是日期形式)。 CURRENT_DATE返回一個日期。它們不是相同的數據類型。仔細比較它們的值。大多數開發人員最初期望像CURRENT_DATE between CURRENT_TIMESTAMP and (CURRENT_DATE + 1)這樣的表達式是真實的,但事實並非如此。將CURRENT_DATE轉換爲輸入timestamp(MySQL中的DateTime),然後與CURRENT_TIMESTAMP進行比較。當它輸入時間戳時,它將是'2013-08-22 00:00:00'。

第三,PHP中可能有一個格式字符串,它可以讓你在一個區域中進行合理排序的值,並在另一個區域中對值進行不同的排序。 PHP文檔警告不要在「非英文」語言環境中使用date()。在其他語言(同一個鏈接。)

格式化日期,你應該使用的setlocale() 和strftime()函數,而不是日期()。