2011-10-07 39 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