MySQL日期范围显示错误

时间:2014-08-22 03:04:51

标签: php mysql sql

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

我的问题是有时当我输入日期范围时没有检索到任何内容,有时它包含一些不在指定范围内的日期。我错过了什么?

2 个答案:

答案 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格式转换为期望日期的日期。