【问题标题】:Mysql between two datetime columns两个日期时间列之间的Mysql
【发布时间】:2012-06-03 06:05:52
【问题描述】:

我有以下代码,但它似乎没有产生预期的结果:

$date_from = '2012-04-27 18:19:33';
$date_to = '2012-05-29 00:59:57';

$database->connect(); 
        $ancestors = mysql_query('
            SELECT * FROM ' . $database->db_prefix . 'comments e
                WHERE e.created BETWEEN "' . $date_from . '" AND "' . $date_to . '" AND   
                    e.ancestors = "' . $comment["id"] . '" AND e.user_id != "' . $user->user_object["id"] . '" AND
                        NOT EXISTS
                        (
                            SELECT null 
                            FROM ' . $database->db_prefix . 'notifications d
                            WHERE  d.target_id = e.id
                        )
                        ORDER BY e.created DESC
        ', $database->connection_handle);
    $database->close();

这可能是一个愚蠢的错误。但是当我不确定选择语句 BETWEEN 和使用的日期是否是有效的 MYSQL 时,我发现很难确定。

任何帮助都会很棒。我一直在搜寻,我所做的似乎是正确的,因此造成了混乱。

已编辑 //

我在 date_from 和 date_to 日期之间创建了许多 cmets,并且通知表中没有通知(不存在部分)......所以基本上,我应该得到大约 25 cmets 回来......相反,我只收到一条评论返回日期为 2012-05-29 00:23:39

已编辑 //

是因为您只能将日期与日期进行比较......以及将时间与时间进行比较吗?为了做到这一点,我该如何调整 mysql?

已编辑 //

之间的函数出错了。我真的不确定它到底出了什么问题。

  1. 能否返回两个日期之间的记录?
  2. 你能举个例子吗?

已编辑 // 问题已解决。这与查询无关,因此可以肯定地说这是正确的做法。我以一种疯狂的方式完成了我的日期范围。感谢你们所有的帮助!!!!

【问题讨论】:

  • 你的代码会产生什么结果?你期望什么结果? MySQL 库中e.created 字段的格式是什么?
  • 为什么还需要CAST?您可以让 PHP 为您进行转换;通常CAST 应该用于数据库中已有的字段:)
  • 正在关注下面的帖子.. :)

标签: php mysql datetime between


【解决方案1】:

MySQL Documentation 中,它指出在使用日期或时间值之间时应使用CAST,因此您的查询应编写如下。

WHERE e.created BETWEEN CAST("' . $date_from . '" AS DATETIME) AND CAST("' . $date_to . '" AS DATETIME) ...

如果您没有获得预期的结果,这可能会解决您的问题。

【讨论】:

  • 是的,自己测试一下,好像没什么区别,不知道为什么文档说推荐使用CAST。
  • 我试过 WHERE e.created >= "' . $date_from .'" AND e.created
  • 在这种情况下,我通常只运行不带 where 语句的查询,然后一一添加不同的部分以确保它按预期过滤。因此,只需在 where 语句中指定日期部分而不是其他任何内容,然后添加其他部分。您可能会发现 where 语句的某个部分与您实际尝试过滤的内容不正确。
  • 我很确定存在性能差异......没有 CAST,这是一个字符串比较,但使用 CAST,它是一个数字比较。不过,至少在使用该日期格式时,您会得到相同的结果。
【解决方案2】:

我遇到了同样的问题,我想你可能想应用这个解决方案:

$from = $_GET['from'];
$to = $_GET['to'];
include("connect.php");
$link=Connection();
$query = "SELECT * FROM records WHERE date_time BETWEEN '$from' AND '$to'";
$result=mysql_query($query,$link);
$list = array();
if($result === FALSE) {
    echo "No data";
}

这里的窍门是signle引号,你需要把你的变量放在那个引号里面让mysql处理它

【讨论】:

    猜你喜欢
    • 2019-08-05
    • 2018-04-30
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多