mysqli用between子句编写语句

问题描述 投票:2回答:3

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

$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并且它没有给出任何错误,因此问题必须在日期的比较中。

php mysql mysqli prepared-statement
3个回答
0
投票

出生列格式为y-d-m hour min sec。但是在你的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';

请尝试一下,让我知道它是否有效


0
投票

我找到了解决方案

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


0
投票

我遇到过同样的问题。我发现另一个线程有同样的问题(不知道如何复制这个线程)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();

希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.