我有两个为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')");
}
编辑:所有答案都很好。我接受了那个回答禁食的人。错误是我自己的错。
答案 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