2011-10-07 37 views
1

我已經從開發人員處訂購了一個項目,並且正在嘗試解決我在此過程中遇到的錯誤。這樣寫的MySQL函數輸出是什麼?

一個是具有DATE_FORMAT()函數的MySQL查詢,它使查詢不返回任何內容。

SELECT * FROM food_cart 
WHERE cart_userId='3' 
AND cart_itemId='8' 
AND date_format(cart_date,'%Y-%m-%d %H')='".date("Y-m-d")."' 

該代碼似乎格式正確,因爲它在phpMyAdmin中執行時不會返回錯誤。但是,它不會返回任何東西。

表看起來是這樣的:

enter image description here

,我認爲它應該嘗試看看剛剛日期(即2011-10-07),而不是確切的時間,因爲它是不與查詢相關。我只是MySQL的初學者,我不太確定我在這裏做什麼。

任何幫助表示讚賞!

Mike。

+0

看起來你正在盲目地返回日期格式。爲了實驗目的,嘗試查詢兩個要比較的項目,例如'select cart_date,curdate()as food from food_cart limit 4',然後查看字段的樣子,然後確定它們是否匹配。通過這種方式,您可以知道所比較的數據與引擎的相似程度,然後您可以計算出如何得出一個評估結果爲真的比較結果。一旦你有了,你可以創建比較。我懷疑日期(cart_date)=日期(curdate())是你想要的。 – horatio

+0

@horatio:最初我嘗試了相同的,但它使用此返回錯誤:http://pastie.org/2659685。我不確定如何做你建議的比較,但我會嘗試。 –

回答

0

按照要求,這裏是我的版本的Johan's answer

$date = date("Y-m-d", $timestamp); 
$sql = "SELECT * FROM food_cart 
     WHERE cart_userId = '3' 
      AND cart_itemId = '8' 
      AND cart_date >= '$date' 
      AND cart_date < '$date' + INTERVAL 1 DAY"; 

這個查詢將

  • 充分利用上cart_date索引,
  • 充分利用查詢緩存,和
  • 準確返回那些日期部分爲cart_date等於$date的行。
1

MySQL不需要日期翻譯自己的領域。
只要確保您輸入的參數格式爲yyyy-mm-dd即可。

$date = date('Y-m-d',$adate); 

$query = "SELECT * FROM food_cart 
WHERE cart_userId = '3' 
    AND cart_itemId = '8' 
    AND cart_date BETWEEN '$date' AND DATE_ADD('$date', interval 1 day) 
    -- and car_date <> DATE_ADD('$date', interval 1 day) 

如果您每天行走此查詢,請取消註釋最後一部分以消除BETWEEN中包含的1秒重疊。這將防止重複的副本。

+0

它不需要日期翻譯,但是如果cart_date =某天@ 1600且adate =某天@ 0000,則日期獲得't equate ... – Farray

+1

我認爲你有'date()'在錯誤的地方:你想'date(cart_date)='$ date''代替。 –

+0

這兩個都沒有返回任何東西:/ –

0

date("Y-m-d")傳遞給查詢時,它假定00:00:00爲小時,分鐘,秒。這就是爲什麼它不會返回任何東西。您可能需要執行範圍搜索才能從同一日期的午夜到11:59:59。

0

改變這一行:

date_format(cart_date,'%Y-%m-%d %H')='".date("Y-m-d")."' 

這將產生類似如下(將永遠是正確的):

'2011-10-07 16'=「2011-10- 07'

而是做

date(cart_date)='".date("Y-m-d")."' 

如果您正在比較日期,請確保等式的兩邊具有相同的精確度。

編輯:這裏的全清理的PHP代碼:

$date = date('Y-m-d'); 
$sql = 'SELECT * ' 
    . 'FROM food_cart ' 
    . 'WHERE cart_userId = 3 ' 
    . ' AND cart_itemId = 8 ' 
    . " AND date(cart_date) = '$date'"; 

應該產生這樣SELECT ... FROM ... WHERE ... AND date(cart_date) = '2011-07-10'一份聲明中,將正確處理日期過濾。

+0

這不起作用:/。聲明如下所示: AND'date(cart_date)'='2011-10-07' –

+0

@Mike。不要在'date(cart_date)'周圍放置單引號。我將用完整的SQL代碼進行更新。 – Farray

+0

@Mike在上面的編輯中要注意一件事。第一行'$ date = date()'使用* PHP's *'date'函數來創建一個字符串'YYYY-mm-dd'。然後,將該字符串插入到SQL語句中,並使用* MySql的*'date'函數從「cart_date」字段提取日期信息,並將其與您的'$ date' PHP字符串進行比較。這與使用'date_format(cart_date,'%Y-%m-%d')'一樣,就像你最初使用的一樣(但沒有不必要的%H)。 – Farray