0

在这里快速,我正在尝试选择两个时间戳之间的所有记录。当前时间和接受日期。接受日期是一个 UNIX 时间戳。我正在尝试从名为“消息”的表中选择记录,并且每条记录的 UNIX 时间戳位于“时间”列中。

这是我尝试过的查询之一

    $query = " SELECT * FROM `messages` WHERE `user_id` = $id \n"
. "And `time` between \"(UNIX_TIMESTAMP($timestamp)\" And UNIX_TIMESTAMP(NOW()) ";

它似乎没有为我返回任何东西。我尝试了很多不同的变化。我也试过这个 - $timestamp 是 Unix 格式..

$query = " SELECT * FROM `messages` WHERE `user_id` = $id \n"
. "And `time` between $timestamp And UNIX_TIMESTAMP(now()) ";

我敢肯定这是显而易见的,非常感谢一些输入!

4

1 回答 1

1

我会通过独立运行来调试它:

SELECT `user_id`, `time`,
       UNIX_TIMESTAMP($timestamp) AS ts_from, UNIX_TIMESTAMP(NOW()) AS ts_to
  FROM `messages`

...确认数据类型和值是您预期的。您可能必须将 $timestamp 的示例嵌入为文字值,以单独测试 SQL。

还有一种可能是计算$timestamp使用与数据库服务器不同的时区设置。根据这些消息记录的新近程度,这可能是一个因素。

更新

这里的问题是混合铸造。UNIX_TIMESTAMP(x)接受 aDATETIME并将其转换为 UNIX 时间戳。还有一个反函数FROM_UNIXTIME(x)它采用 UNIX 时间戳并将其转换为 DATETIME

在谓词子句time BETWEEN x AND y中,所有 3 个参数必须是相同的类型。

因此,假设您的time列包含 a DATETIME,我认为您只是想要:

$query = "SELECT * FROM `messages` WHERE `user_id` = $id "
       . "And `time` between FROM_UNIXTIME($timestamp) And NOW() "; 

另一方面,如果time是 UNIX 时间戳:

$query = "SELECT * FROM `messages` WHERE `user_id` = $id "
       . "And `time` between $timestamp And UNIX_TIMESTAMP(NOW()) "; 
于 2013-08-30T00:49:08.343 回答