MySQL日期范围显示错误


MySQL date range display errors

我需要一些帮助检查我的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'";