在SQL查询中按日期范围过滤

时间:2012-08-21 21:09:55

标签: php sql

我无法使用以下代码:

    // dd/mm/yyyy for dates in SQL queries
    $todayforw = date('d/m/Y');
    $aweekago  = date('d/m/Y', time() - 604800);

    $week_e_check = mysql_query("SELECT * FROM earningslog WHERE user_id = '".$info['id']."' WHERE day >='".$aweekago."' AND day <'".$todayforw."'");

    while ($week_e_info = mysql_fetch_array($week_e_check)) {
        $week_e = $week_e + $week_e_info['user_earnings_amnt'];
    }

查询返回零行,但是,它应该返回符合条件的数据。

4 个答案:

答案 0 :(得分:1)

尝试将字符串的格式从d / m / Y更改为Y-m-d。

MySQL可能会在第一年就期待它。在这种情况下,它可能用d / m / Y做错了。

也不要两次使用WHERE子句。相反,使用AND组合条件,例如:

WHERE      user_id = '".$info['id']."'
       AND day >='".$aweekago."'
       AND day <'".$todayforw."'

顺便说一下,您也可以尝试说WHERE day BETWEEN ".$aweekago." AND ".$todayforw.",这可能是更容易阅读的语法(只要您将$ todayforw更改为前一天)。

答案 1 :(得分:1)

检查您的日期格式:

应该是:

YYYY-mm-dd HH:mm:ss

E.G。 2012-01-01 00:00:00(2012年1月1日当地时间午夜)

其他日期格式可以工作,但最好的方法是使用MySQL在显示日期时使用的相同格式,这是我知道每次都有效的唯一方式。

http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

你的语法也不正确,你有两个,你应该使用AND。

答案 2 :(得分:1)

仔细查看您的查询:

  SELECT * FROM earningslog WHERE user_id = '".$info['id']."' WHERE day >='".$aweekago."' AND day <'".$todayforw."'"

您的Where子句出现两次。

要考虑的两件事 - 当您选择数据时,请尝试远离选择* - 您可能会得到意外的表格结果。

其次,尝试将查询创建为参数化查询,而不是将参数直接注入到where子句中。通过以您的方式直接注入您的标准,您可以自己开始SQL注入攻击。

通过将其转换为参数化查询,您可以直接针对数据库调试查询,从而减少将查询工具复制到代码中所需的工作量。

答案 3 :(得分:1)

您的问题似乎与您的查询语法有关。您正在说明WHERE两次,而您应该只声​​明一次,然后使用AND或OR运算符作为进一步的标准。我还建议您将语句移动到变量中或使用die()来帮助调试。

 $week_e_check = mysql_query("SELECT * FROM earningslog WHERE user_id = '".$info['id']."' AND day >='".$aweekago."' AND day <'".$todayforw."'") or die(mysql_error()); 

此外,您不应该使用mysql扩展名,因为不鼓励使用此扩展名。相反,请使用MySQLiPDO_MySQL扩展名。使用这些替代扩展之一将有助于防止SQL注入的第一步。我还建议你避免使用*并指定要返回的列名。

使用PDO:

<?php

/* Execute a prepared statement by passing an array of values */
$sth = $dbh->prepare('SELECT * FROM earningslog WHERE user_id = ? AND day >= ? AND day < ?');
$sth->execute(array($info['id'], $aweekago, $todayforw));
$results = $sth->fetchAll();

?>