我需要一些帮助检查我的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'
我的问题是有时当我输入一个日期范围没有检索,其他时间它包括一些日期不在指定范围内。我错过了什么?
您的问题是数据库中的日期存储为字符串而不是日期。因此,使用字符串比较。更糟糕的是,您没有使用ISO标准的YYYY-MM-DD语法,而是将日期放在前面。这就像把一年中的日子按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格式的字符串常量转换为日期。
试试这个,如果您将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'";