我需要一些帮助来检查我的SQL查询。
我有一个数据库,它将一些信息存储在两个表中,一个表中有一个列,其中包含该人注册的日期。我希望能够检索在特定日期范围内注册的人员的一些信息。
这是我的代码:
SELECT personal_info.member_id, personal_info.surname, personal_info.first_name, personal_info.phone_number, personal_info.email_address, personal_info.postal_address, church_info.received_date
FROM personal_info, church_info
WHERE personal_info.member_id = church_info.member_id
AND church_info.received_date between '$startdate' AND '$enddate'
我的问题是有时当我输入日期范围时没有检索到任何内容,有时它包含一些不在指定范围内的日期。我错过了什么?
答案 0 :(得分:0)
试试这个,如果你将received_date声明为DATETIME
,则可能会出现问题$sql = "
SELECT
personal_info.member_id,
personal_info.surname,
personal_info.first_name,
personal_info.phone_number,
personal_info.email_address,
personal_info.postal_address,
church_info.received_date
FROM personal_info
LEFT JOIN church_info ON personal_info.member_id = church_info.member_id
WHERE
AND DATE(STR_TO_DATE(church_info.received_date, '%Y-%m-%d')) between '$startdate'
AND '$enddate'";
答案 1 :(得分:0)
您的问题是数据库中的日期存储为字符串而不是日期。因此,使用字符串比较。更糟糕的是,不是使用YYYY-MM-DD的ISO标准语法,而是将时间放在第一位。这就像计算几年中的日子,即1月1日,2月1日,3月1日。 。 。,12月1日,1月2日,2月2日。一个糟糕的日期格式。使用本机格式。这就是他们的目的。如果您可以控制数据库,请修复数据库中的数据格式,以便准确反映存储的值。
如果没有,您可以使用str_to_date()
功能解决问题:
str_to_date(church_info.received_date, '%d/%m/%Y') between
str_to_date('$startdate', '%d/%m/%Y') AND str_to_date('$enddate', '%d/%m/%Y')
但是对于常量,我只是在应用程序中修复它们。 MySQL将自动并正确地将字符串常量以YYYY-MM-DD格式转换为期望日期的日期。