php - 从日期范围之间的mysql表列中选择

时间:2014-06-12 15:55:17

标签: php mysql

我正在尝试在某些日期之间从表中选择一些时间项,但我认为我有时间戳/日期时间转换问题。

首先,存储在我的log_table MySQL表中的记录存储在DATETIME数据类型中,此后,我可以将strtotime()结果作为日期范围用于SELECT 1}}子句?

其次,我SELECT列中的log_time列之间的log_date可以log_date,而不会无意中选择我的$date = date("Y-m-d"); $date1 = str_replace('-', '/', $date); $from_date = date('m-d-Y',strtotime($date1 . "-15 days")); $date = date("Y-m-d"); $date1 = str_replace('-', '/', $date); $to_date = date('m-d-Y',strtotime($date1)); $sql2 = "SELECT log_time FROM log_table WHERE log_date >= $from_date AND log_date < $to_date"; $query = $this->db->prepare($sql2); $query->execute(); $Pro1 = $query->fetchAll(); $Pro1 = array_reverse($Pro1); print "<pre>"; print_r($from_date); print "</pre>"; 列吗?截至目前,我被归还了一个空数组。

PHP脚本

{{1}}

2 个答案:

答案 0 :(得分:6)

为了让您的日期格式正确,您正在做一些非常奇怪的事情。例如,为什么要指定格式为Y-m-d的数据,仅在下一行中转换并通过字符串替换转换为Y/m/d?这很奇怪。

我会建议一些事情:

首先,熟悉PHP DateTimeDateInterval和相关类。这些是提供日期时最实用的工具。

其次,如果您的MySQL数据库列是日期列,则必须使用Y-m-d格式,因为这是此列类型的预期格式。

使用DateTime的示例:

$date = new DateTime();
$to_date = $date->format('Y-m-d');
$date->modify('-15 days');
$from_date = $date->format('Y-m-d');

就是这样。这就是获取数据库查询格式的两个日期所需的一切。

第三,您需要引用查询中使用的日期字符串。如果没有这个,你将得到无效的语法。

$sql2 = "SELECT log_time FROM log_table WHERE log_date >= '$from_date' AND log_date < '$to_date'";

第四,您实际应该检查prepare()execute()等的结果,以确保您获得所需的行为并记录错误,以便您可以更好地理解任何问题。

$query = $this->db->prepare($sql2);
if (false === $query) {
    // something went wrong get error message and log it here
} else {
    $result = $query->execute();
    if (false === $result) {
        // the query failed log an error message
    } else {
        // fetch your data
    }
}

第五,既然你正在经历使用准备好的陈述的麻烦,你可能要考虑使用参数化的准备语句(这是一个好习惯),尽管在这种情况下,由于你控制了所有语句,因此没有令人信服的安全理由查询输入。

第六,为什么在返回的数组上使用array_reverse()?这里应该注意,array_reverse()绝对不能保证任何特定的排序,因为您的查询(如书面形式)不保证任何特定的排序。如果您希望按特定顺序排列数据,只需使用ORDER BY子句在查询中应用排序即可。目前,您只是颠倒无序结果集的顺序,这是不必要的。注意:您需要在排序中使用的所有字段上都有索引才能优化查询。

例如:

$sql2 = "SELECT log_time FROM log_table WHERE log_date >= '$from_date' AND log_date < '$to_date' ORDER BY log_date DESC, log_time DESC";

答案 1 :(得分:1)

试试这个:

$from_date = date('Y-m-d H:i:s',strtotime('-15 days'));
$to_date = date('Y-m-d H:i:s');

$sql2 = "SELECT log_time FROM log_table WHERE log_date >=".$from_date." AND log_date <".$to_date;