php MySQL:比较millis中的时间戳的问题

时间:2014-02-07 15:43:44

标签: php mysql timestamp

我对Timestamps及其比较的主题感到非常困惑。

我想要的是:我有一个小聊天应用程序。每当用户在聊天室内时,每隔5秒就会向服务器发送一个异步请求,其时间为毫秒(从5秒前开始,该过程是

  1. 打开聊天
  2. 以毫秒存储实际时间
  3. 5秒后发送带有该值的请求并以毫秒(REPEAT)存储实际时间
  4. 现在首先,我通过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是毫秒。这不起作用!我通过创建数据库中某些日期值之间的millis值手动测试它,并且没有给出结果。

    现在,我应该在可比较的时间戳中将php转换为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()确实返回millis ...)

1 个答案:

答案 0 :(得分:1)

首先,听起来你的$ 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;

此外,您的&#39;&lt;&#39;标志似乎倒退了。如果您想要之后的所有条目需要的时间

commentDate > ".$m/1000."

最后,看起来你的架构是错误的,而commentDate不是时间戳。它实际上是一个&datetime&#39;,它是不同的。因此,您需要将时间戳转换为日期时间:

 commentDate > FROM_UNIXTIME($m/1000)