PHP MySQL : problems with comparing timestamps in millis

标签 php mysql timestamp

我对时间戳及其比较这个主题感到非常困惑。

我想要什么:我有一个小聊天应用程序。每当用户在聊天中时,每 5 秒就会向服务器发送一个异步请求,时间以毫秒为单位(从 5 秒前开始,过程为

  1. 打开聊天
  2. 以毫秒为单位存储实际时间
  3. 5 秒后发送具有该值的请求并以毫秒为单位存储实际时间(重复)

现在,首先,我通过这样做得到了 Javascript 中的实际毫秒

var now = new Date();
lastChatChecked = new Date(now.getUTCFullYear(), 
                               now.getUTCMonth(), 
                               now.getUTCDate(),  
                               now.getUTCHours() + 1, 
                               now.getUTCMinutes(), 
                               now.getUTCSeconds(), 
                               now.getUTCMilliseconds());
lastChatChecked = lastChatChecked.getTime();

请注意,我必须在小时字段中添加 +1,因为时间戳始终比我的时间晚一个小时。现在,当将此值发送到服务器并执行类似的操作时

SELECT commentContent, commentDate, userName  
    FROM chatComment c, User u 
    WHERE commentDate < ".$m." 
    AND c.userID = u.userID 
    AND teamID=".$tid." 
    ORDER BY c.commentDate DESC;

其中 $m 是毫秒。这不行!我通过创建一个介于数据库中某些日期值之间的毫秒值来手动测试它,并且没有返回任何结果。

现在,我应该将 php 中的毫秒转换为可比较的时间戳,还是有其他方法可以做到这一点?我在一个这样的问题中看到了这种方法

WHERE commentDate < DATE_SUB(now(), INTERVAL 5 SECONDS)

但仍然没有结果。

方案

(从头开始,我这里没有方案)

CREATE TABLE User(
    userID      INTEGER AUTO_INCREMENT NOT NULL,
    userName    VARCHAR(20) NOT NULL,
    userPW      VARCHAR(200) NOT NULL,
    ...
    PRIMARY KEY (userID),
    UNIQUE (userName)
)ENGINE=innodb;

CREATE TABLE(
    commentID       INTEGER AUTO_INCREMENT NOT NULL,
    userID          INTEGER NOT NULL,
    teamID          INTEGER NOT NULL,
    commentContent  VARCHAR(250) NOT NULL,
    commentDate     TIMESTAMP NOT NULL,
    PRIMARY KEY (commentID),
    FOREIGN KEY (userID) REFERENCES User (userID),
    FOREIGN KEY (teamID) REFERENCES Team (teamID)
)ENGINE=innodb;

php

function getNewestMessages($m){
    mysql_query ('SET CHARACTER SET utf8');
    $res = mysql_query("SELECT teamID FROM Team WHERE teamName='".$_SESSION['tn']."';");
    $temp = array();

    while($row = mysql_fetch_array($res)){
        $temp[] = $row;
    }
    $tid = $temp[0]['teamID'];

    $query = "SELECT commentContent, commentDate, userName  from chatComment c, User u WHERE commentDate < ".$m." AND c.userID = u.userID AND teamID=".$tid." ORDER BY c.commentDate DESC;";
    $res2 = mysql_query($query);
    $temp2 = array();

    while($row2 = mysql_fetch_array($res2)){
        $temp2[] = $row2;
    }

    echo json_encode($temp2);
}

SELECT commentDate FROM chatComment;的一些结果

2014-02-06 21:50:08  
2014-02-06 21:50:11  
2014-02-06 21:53:11  
2014-02-06 21:54:12  
2014-02-06 21:54:17  
2014-02-06 21:56:16 

编辑时的一些结果

echo json_encode($m)

"1391792194985"  
"1391792198943"  
"1391792203927"  


echo json_encode(round($m/1000))

1391792144  
1391792149  
1391792154  
1391792159  

(看来 Javascript 函数 date.getTime() 确实返回毫秒...)

最佳答案

首先,听起来您的 $m 值以毫秒为单位。现在我不确定这是否意味着从纪元开始的毫秒数,例如毫秒时间戳,但如果是这样,您需要将其转换为秒。 MySQL 时间戳以秒为单位。

SELECT commentContent, commentDate, userName  
FROM chatComment c, User u 
WHERE commentDate < ".$m/1000." 
AND c.userID = u.userID 
AND teamID=".$tid." 
ORDER BY c.commentDate DESC;

此外,你的“<”符号看起来是反的。如果您想要在您需要的时间之后的所有条目

commentDate > ".$m/1000."

最后,您的架构似乎是错误的,commentDate 不是时间戳。它实际上是一个“日期时间”,这是不同的。所以你需要将时间戳转换为日期时间:

 commentDate > FROM_UNIXTIME($m/1000)

关于PHP MySQL : problems with comparing timestamps in millis,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21631945/

相关文章:

javascript - php 变量转换为 javascript

php - 想要手动发送 SYN ACK 数据包来建立 TCP 连接(如果可能的话在 PHP 中)

MySql "cannot update parent row"当我有 "ON UPDATE CASCADE"时

MySQL COUNT where 和 COUNT all

php - 如果时间戳范围在时间戳范围内

PHP undefined variable css

php - Paypal 自适应支付 PHP Soap SDK 未定义的定义

mysql - 数据库设计缺陷

php - 检查用户是否登录的替代方法

java - 在 Wicket 中特定构建的页面上显示日期