如果SQL查询中的UNIX_TIMESTAMP较小?

时间:2012-12-28 15:48:00

标签: php mysql

如果unix时间戳小于db中记录的日期时间,我正在尝试仅从数据库中获取数据,并且遇到了一些问题。

这是我到目前为止所得到的;

date_default_timezone_set("UTC");
$now = date("Y-m-d H:i:s", time());
$timestamp = strtotime($now); 
$timestamp2 = strtotime('-3 days', $timestamp);

$sql = "SELECT g.game_id, UNIX_TIMESTAMP(g.lastdraw)+259200 AS dbtimestamp FROM ".$prefix."_games g 
            INNER JOIN ".$prefix."_gameplayer gp
                ON g.game_id = gp.fk_game_id
            WHERE dbtimestamp < $timestamp2 AND gp.fk_player_id=$currplayer AND g.finished=0";
$result = mysql_query($sql);
while($row = mysql_fetch_assoc($result)){
        //if($row['dbtimestamp'] < $timestamp2){
        $thisgameid = $row['game_id'];

        if($thisgameid == 257748){
            echo '<b>GameID: '.$thisgameid.'</b><br>';
        } else {
            echo 'GameID: '.$thisgameid.'<br>';
        }
        echo 'DBtimestamp: '.$row['dbtimestamp'].'<br><br>';
    //}
}

我没有以这种方式得到任何记录。但是如果我在sql查询中删除了“dbtimestamp&lt; $ timestamp2”并删除了“if($ row ['dbtimestamp']&lt; $ timestamp2){”一切正常?

我出错的任何想法?

提前致谢: - )

3 个答案:

答案 0 :(得分:2)

为什么在使用本机日期/时间操作直接在MySQL中执行此操作时,是否会弄乱PHP时间戳和MySQL date-&gt; timestamp值?

SELECT ..
WHERE g.lastdraw < (NOW() - INTERVAL 3 DAY)

答案 1 :(得分:1)

这可能无法直接回答问题。但是,有些事情值得指出,对于评论来说太大了。

以下内容:

$now = date("Y-m-d H:i:s", time());
$timestamp = strtotime($now); 
$timestamp2 = strtotime('-3 days', $timestamp);

可以改写为:

$timestamp2 = strtotime('-3 days');

此外,MySQL有几个Date Time functions。使用DATE_ADD()之类的内容而不是UNIX_TIMESTAMP(g.lastdraw)+259200之类的内容。

答案 2 :(得分:0)

查询不仅没有返回任何行,查询实际上应该抛出这样的错误:

Error Code: 1054
Unknown column 'dbtimestamp' in 'where clause'

SQL语句的问题在于,在语句的WHERE子句中引用SELECT列表中的表达式的别名(例如dbtimestamp)无效。

(即使它是有效的,你也不想在谓词中使用该表达式。你希望你的谓词在你用来导出该表达式的裸lastdraw列上。)

要调试SQL语句的问题,规范模式是回显包含SQL语句(在您的情况下为$sql)的字符串的内容,然后通过在另一个环境中运行它来测试该语句(例如mysql命令行客户端)。


一个“修复”是用实际表达式替换WHERE子句中的dbtimestamp别名。例如

WHERE UNIX_TIMESTAMP(g.lastdraw)+259200 < $timestamp2 

但是......虽然这会让你解决1054错误,但这不是真正正确的修复。为了性能,你真的不想在左侧进行添加。你最好使用形式的谓词:

WHERE UNIX_TIMESTAMP(g.lastdraw) < $timestamp2 - 259200

注意,如果lastdraw列不是TIMESTAMP数据类型,那么您还希望避免在左侧调用UNIX_TIMESTAMP函数,而是将右侧包装在FROM_UNIXTIME函数中。

WHERE g.lastdraw < FROM_UNIXTIME( expr )