【问题标题】:old question - but unsolved: no result SELECT * FROM table WHERE my_datetime_field BETWEEN start AND end老问题 - 但未解决:没有结果 SELECT * FROM table WHERE my_datetime_field BETWEEN start AND end
【发布时间】:2019-06-04 14:54:23
【问题描述】:

我有一些代码可以用 PHP 5.6.38 和 PDO 查询 MariaDB。数据库和代码工作正常,但如果我将 BETWEEN 运算符与两个日期时间一起使用,代码不会给出任何结果 - 这意味着 Null - 并且没有错误 - 没有异常 - 始终为 Null。 MariaDB 中的字段类型是 DATETIME。存储在 DB 中的格式为 '2019-05-06 14:16:32'。

我尝试了许多来自 stackoverflow 的技巧。问题接缝很老而且众所周知,但我目前没有解决方案。我当前的代码如下所示:

(使用简单的网络服务器测试问题的示例代码)

<?php

$cal = new Calendar();

var_dump($cal->GetDatabaseEvents('2019-06-01T00:00:00+200', '2019-06-10T23:59:59+200'));

class Calendar {

  private $dbh;

  public function __construct() {
    $this->dbh = new PDO('mysql:host=localhost;dbname=calendar', 'mytable', 'mypwd');
    $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  }


  public function GetDatabaseEvents($start, $end) {
    $sql ="SELECT id, datetime_begin FROM events WHERE datetime_begin BETWEEN '2019-06-00T00:00:00' AND '2019-06-10T23:59:59'";
    $sth = $this->dbh->prepare($sql);
    if($count = $sth->execute()) {
      while ($row = $sth->fetchObject()) {
        echo some member of $row...
      }
    } else {
      echo "SQL Error <br />";
      echo $sth->queryString."<br />";
      echo $sth->errorInfo()[2];        
    }
  }
}

没有错误或异常。所有结果均为 NULL。如果我从 SQL 中删除 FROM 部分,则语句可以正常工作并给出预期的结果。

我尝试了许多其他技巧,例如 a) CAST('2019-01-05T00:00:00', DATE 或 DATETIME) 或 b) 没有像这样的 ISO DateTime '2019-01-05 00:00:00' 有 CAST 和没有 CAST 或 c) 没有 BETWEEN 但 (datetime_begin >= begin AND datetime_begin bindParam(':start_date', $start, PDO::PARAM_STR);

但所有结果都是NULL

你有什么建议吗?

【问题讨论】:

标签: sql datetime mariadb between php-5.6


【解决方案1】:

存储在数据库中的格式是'2019-05-06 14:16:32'

数据库使用 interval 格式存储日期/时间值。这让我认为您正在使用字符串 -- 和字符串比较。

虽然我认为 MySQL/MariaDB 允许这样做,但我也觉得您指的是一个月的零日令人困惑。

我会推荐:

WHERE datetime_begin >= '2019-06-01' AND
      datetime_begin < '2019-06-11'

【讨论】:

  • -好的-谢谢:您的示例没有字符串?在您的示例中,“2019-06-01”是什么?它看起来像一个字符串? - 零日是一个错误,我的意思是 2019-06-01 或任何其他有效的日期时间
  • 这是一个字符串,在查询中被视为日期常量。
  • 是的 - 当然 - 这不是我的问题 - 我的问题是,我怎样才能启动并运行我的 SQL 语句?有什么建议吗?
【解决方案2】:

如果您的实际数据是“2019-05-06 14:16:32”,则它不在“2019-06-00T00:00:00”和“2019-06-10T23:59:59”之间:5 月6 6 月 00 日至 6 月 10 日之间。

否则,我复制粘贴了您的代码,更改了连接字符串,以匹配我的数据库,并更改表名/字段以匹配我拥有的带有 DATETIME 字段的表,并且它在 php 7.2.16 上运行良好。

最后,你在一个不返回任何东西的函数上使用了 var_dump(),所以你总是会得到一个 NULL 作为显示的最后一行。

【讨论】:

  • 谢谢你 - 你没事 - 我今天早上发现了很大的失败 - 抱歉 - 有人在后台覆盖了我的表,我所有的努力都是徒劳的 - 日期时间字段无声设置为 0000-00-00 00:00:00 并且我的操作员 BETWEEN 显示了奇怪的行为 - 抱歉 - 真的很遗憾 - 抱歉
猜你喜欢
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 2015-11-22
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
相关资源
最近更新 更多