【问题标题】:mysqli prepared statements with between clausemysqli 用 between 子句准备语句
【发布时间】:2016-01-21 11:37:09
【问题描述】:

我的问题与 [this][1] 类似,但那里提供的解决方案对我不起作用。 我有一个数据库,我有一个名为birth 的列,其中包含year-day-month 00:00:00 格式的日期。现在我想从数据库中提取出生在两个日期之间的所有记录。 birth 值已使用此代码插入数据库中

$date =  $day . "-" . $month. "-" . $year;
$a = strptime($date, '%d-%m-%Y');
$DB_date = date('Y-m-d H:i:s',mktime(0, 0, 0, $a['tm_mon']+1, $a['tm_mday'], $a['tm_year']+1900));

要提取我使用此代码的日期:

$stmt = $conn->prepare('SELECT * FROM database WHERE `birth` BETWEEN ? AND ?');
$start_date = '1990-01-01';
$stop_date = '1995-01-01';
$stmt->bind_param('ss',$start_date,$stop_date);
$stmt->execute();
$result = $stmt->get_result();

但它没有找到任何东西,所以$result->num_rows 等于0 并且它没有给出任何错误,所以问题必须在日期的比较中。

【问题讨论】:

  • 你能从你的表中展示一些示例数据吗? (顺便说一句:为什么是 y-d-m 而不是 iso-standard y-m-d,它的好处是可排序且不会让人困惑?)
  • 您的列出生日期是 DATETIME 类型,还是只是一个 VARCHAR 列,您以该格式存储日期?
  • @GeraldSchneider birth的类型是date
  • 这与您的示例不符,您不能在 DATE 列中存储时间。

标签: php mysql mysqli prepared-statement


【解决方案1】:

出生列格式为 y-d-m 小时分钟秒。但是在您的 where 子句中,您忽略了小时分钟第二个因素。

替换:

$start_date = '1990-01-01';
$stop_date = '1995-01-01';

有了这个:

$start_date = '1990-01-01 00:00:00';
$stop_date = '1995-01-01 00:00:00';

请尝试一下,如果它有效,请告诉我

【讨论】:

  • 这与 DATETIME 列无关。
  • 如果字段类型是日期时间,那么您必须在 DATETIME 值之间进行比较,而不仅仅是 DATES。
  • birth的数据类型为date。把小时放在日期上没有任何区别,行为和以前一样......
【解决方案2】:

我找到了解决办法

如果数据库中列的数据类型为datetime,并且您还需要确保$start_date 早于$stop_date,则我的问题中的代码有效。我仍然想知道为什么它不适用于 date 数据类型。

【讨论】:

    【解决方案3】:

    我有同样的问题。我发现另一个有同样问题的线程(不知道如何复制这个线程)here 不过总结一下,

    他们设法通过将参数的问号括起来来获得所需的结果。

    $stmt = $conn->prepare('SELECT * FROM database WHERE `birth` BETWEEN (?) AND (?)');
    $start_date = '1990-01-01';
    $stop_date = '1995-01-01';
    $stmt->bind_param('ss',$start_date,$stop_date);
    $stmt->execute();
    $result = $stmt->get_result();
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2012-12-01
      • 2013-10-22
      • 2012-02-02
      • 1970-01-01
      • 2015-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多