【问题标题】:MySQL select date range issueMySQL选择日期范围问题
【发布时间】:2011-02-04 10:50:39
【问题描述】:

在我的 sql 查询中使用 BETWEEN 得到一些奇怪的结果。想知道是否有人可以帮助我理解为什么我会得到这些结果。

我正在搜索 dd/mm/yyyy 格式的日期范围。所以我想选择某个日期范围内的所有条目。

$dbSearchRecords_result = "SELECT * FROM $tbl_name WHERE Date BETWEEN '$DateFrom_order' AND '$DateTo_order'";

$dbSearchRecords_result = mysql_query($dbSearchRecords_result);

然后我在一个数组的 while 语句中调用结果

while ($row = mysql_fetch_array($dbSearchRecords_result)){

现在,如果我搜索 BETWEEN 12/02/2011 14/02/2011,则会返回 13/12/2010 的日期。

但是,如果我搜索 12/02/2011 13/02/201,我不会得到 13/12/2010 的结果。

任何想法都将不胜感激。

谢谢。

【问题讨论】:

  • 您确定您的日期变量实际上被格式化为正确的日期吗?
  • 您检查过PHP生成的SQL语句是否符合您的预期吗?
  • @KeenLearner。我才刚刚意识到这对我来说很愚蠢。我很确定这是主要问题。谢谢老兄。

标签: mysql


【解决方案1】:

BETWEENoperator 很可能会将您的范围读取为字符串。 From the book:

为了获得最佳效果,使用 BETWEEN 使用日期或时间值,使用 CAST() 将值显式转换为 所需的数据类型。示例:如果 您将 DATETIME 与两个 DATE 进行比较 值,将 DATE 值转换为 日期时间值。如果你使用一个字符串 常量,例如 a 中的 '2001-1-1' 与 DATE 比较,转换字符串 到一个日期。

那么,试试吧:

SELECT * FROM `mytable` 
WHERE `date` BETWEEN CAST('2011-01-02' AS DATE) AND CAST('2011-12-02' AS DATE)

【讨论】:

    【解决方案2】:

    MySQL 需要这种格式的值来进行适当的比较:

    YYYY-MM-DD
    

    您可以使用STR_TO_DATE 将您的字符串转换为正确的格式。

    显然,Date 字段必须是 DATEDATETIME 类型。

    【讨论】:

      【解决方案3】:

      尝试将值格式化为 DATE.. 就像在

      中一样
      $dbSearchRecords_result = "SELECT * FROM $tbl_name WHERE Date BETWEEN DATE('$DateFrom_order') AND DATE('$DateTo_order')";
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-02
        • 2019-05-17
        • 2012-04-12
        • 2017-04-21
        • 1970-01-01
        • 2011-04-27
        • 1970-01-01
        • 2013-04-02
        相关资源
        最近更新 更多