如果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){”一切正常?
我出错的任何想法?
提前致谢: - )
答案 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 )