Mysql FROM_UNIXTIME

时间:2011-03-11 19:47:19

标签: php mysql sql

我有两个为DATETIME格式化的PHP变量,但该列是在UNIX时间戳中。我如何正确地对他们进行BETWEEN?

$date_from$date_to采用DATETIME格式。 dateline存储为UNIX时间戳。

以下不起作用:

if($date_from != "" && $date_to != "") {
    $result_pag_num = mysql_query("SELECT COUNT(*) AS count FROM messages WHERE (folder = '$folder' AND username = '$username' AND FROM_UNIXTIME(dateline) BETWEEN '$date_from' AND '$date_to')");
} else {
    $result_pag_num = mysql_query("SELECT COUNT(*) AS count FROM messages WHERE (folder = '$folder' AND username = '$username')");
}

编辑:所有答案都很好。我接受了那个回答禁食的人。错误是我自己的错。

3 个答案:

答案 0 :(得分:1)

您可能希望将查询更改为

... AND dateline BETWEEN UNIX_TIMESTAMP('$date_from') AND UNIX_TIMESTAMP('$date_to')

这样MySQL可以在日期行字段上使用索引。您的版本强制它在进行比较之前将每个日期行字段转换为日期时间值,从而无法使用索引。

否则,查询看起来很好。您确定$date_from$date_to格式正确,并且有适合查询中所有子句的记录吗?

答案 1 :(得分:1)

如果数据库中的dateline列存储为时间戳,您应该将PHP变量转换为时间戳,而不是将dateline列转换为日期时间。< / p>

为什么?
为了避免将FROM_UNIXTIME()函数应用于该列:如果你确实使用了像你发布的那个函数,那么MySQL必须扫描每个请求的整个表,将该函数应用于所有行。 。
...这意味着你将失去你在dateline上可能拥有的任何索引的优势 - 并让你的MySQL服务器做更多工作。


因此,以另一种方式重写您的查询:将DateTime的PHP变量转换为UNIX时间戳(数据库中的数据类型),使用DateTime::format和{{ 1}}格式:

U


作为旁注:也许您之前在代码中执行此操作,但不要忘记使用mysql_real_escape_string()正确地转义数据 - 尤其是字符串。

答案 2 :(得分:1)

您不需要FROM_UNIXTIME函数。由于dateline列是数据类型TIMESTAMP,MySQL将为您进行转换:

AND dateline BETWEEN '2011-03-01' AND '2011-03-11 17:00'

要真正研究这个问题,我们需要知道$ date_from和$ date_to变量的实际内容,以及传递给MySQL的实际语句。

此外,时区设置可能会影响日期时间值的解释和比较方式。

如果你传递的是unixtime样式整数,那么你应该省略单引号(以避免MySQL进行字符串比较的可能性)

AND FROM_UNIXTIME(dateline) BETWEEN 1299801600 AND 1298998800