我的问题类似于[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
并且它没有给出任何错误,因此问题必须在日期的比较中。
出生列格式为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';
请尝试一下,让我知道它是否有效
我找到了解决方案
如果数据库中列的数据类型是datetime
,并且您还需要确保$start_date
比$stop_date
旧,则我的问题中的代码有效。我仍然想知道为什么它不适用于date
数据类型。
我遇到过同样的问题。我发现另一个线程有同样的问题(不知道如何复制这个线程)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();
希望这可以帮助。