2011-03-11 14 views
0

我有2个PHP变量格式化为DATETIME,但列在UNIX时间戳中。我如何正确地对他们做一个BETWEEN?Mysql FROM_UNIXTIME

$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

你有什么应该工作。在执行该查询之前,请确保MySQL时区设置正确。 – Matthew 2011-03-11 19:50:37

回答

1

你可能想查询更改为

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

这样,MySQL能够在日界线实地使用索引。您的版本强制它在进行比较之前将每个日期行字段转换为日期时间值,这使得不可能使用索引。

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

+0

这不适合我。 $ date_from是'2011-03-11 00:00:00',$ date_to是'2011-03-11 23:59:59'。一个exmaple日期线是'1299526727' – ParoX 2011-03-11 19:55:02

+0

那么,这两个日期出来'1299823200'和'1299909599'。你的'1299526727'比两者都小,所以它不是“之间”。 – 2011-03-11 19:57:52

+0

我正在使用错误的日期,哈哈。 – ParoX 2011-03-11 20:04:01

1

如果您在数据库dateline列存储为一个时间戳,你应该转换PHP变量时间戳,而不是dateline列转换为日期时间。

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


所以,重写查询的其他方式角落找寻:转换DateTime小号PHP变量UNIX时间戳(您在数据库中有数据类型),使用DateTime::formatU格式:

$ts_from = $date_from->format('U'); 
$ts_to = $date_to->format('U'); 

$result_pag_num = mysql_query("SELECT COUNT(*) AS count 
        FROM messages WHERE (
         folder = '$folder' 
         AND username = '$username' 
         AND dateline BETWEEN $ts_from AND $ts_to 
        )"); 


作为一个备忘录:也许你在代码中早些时候做过这些工作,但不要忘记使用mysql_real_escape_string()正确地转义数据 - 特别是字符串。

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 
相关问题