我的问题类似于[this] [1],但那里提供的解决方案对我不起作用。
我有一个数据库,我有一个名为birth
的列,其中包含year-day-month 00:00:00
格式的日期。现在我想从DB中提取出生在两个日期之间的所有记录。
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
并且它不会出现任何错误,因此问题必须在日期的比较中。
答案 0 :(得分: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';
请尝试一下,让我知道它是否有效
答案 1 :(得分:0)
我找到了解决方案
如果数据库中列的数据类型为datetime
,则我的问题中的代码有效,您还需要确保$start_date
早于$stop_date
。我仍然想知道它为什么不能使用date
数据类型。
答案 2 :(得分: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();
希望这会有所帮助。