【问题标题】:How do I query between two dates using MySQL?如何使用 MySQL 在两个日期之间进行查询?
【发布时间】:2011-04-18 20:51:53
【问题描述】:

以下查询:

SELECT * FROM `objects` 
WHERE (date_field BETWEEN '2010-09-29 10:15:55' AND '2010-01-30 14:15:55')

什么都不返回。

我应该有足够的数据来让查询工作。我做错了什么?

【问题讨论】:

  • 谨慎使用 BETWEEN,因为 minmax 值都被认为在范围内,因此不会处理两次日期,即 minmax 值 (边缘情况)。例如,日期2010-09-29 00:00:00介于2010-09-28 00:00:002010-09-29 00:00:00AND ALSO 介于2010-09-29 00:00:002010-09-30 00:00:00
  • 是的,他说的是^^

标签: mysql sql


【解决方案1】:

您的第二个日期在您的第一个日期之前(即您在 2010 年 9 月 29 日和 2010 年 1 月 30 日之间进行查询)。尝试颠倒日期的顺序:

SELECT *
FROM `objects`
WHERE (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')

【讨论】:

  • 我确实知道这一点,但现在 UPDATE 有问题。我正在尝试使用 BETWEEN 进行更新,它应该以同样的方式工作吗?
  • @IngusGraholskis:where 子句在 selectupdate 语句上的作用应该相同。
  • 就我个人而言,我发现“from”和“to”这两个词是用来记住查询的编写顺序的一种偷偷摸摸的方式。
  • 如果两个日期都为空或为空,如何返回所有数据?
【解决方案2】:

您的查询的日期应为

select * from table between `lowerdate` and `upperdate`

试试

SELECT * FROM `objects` 
WHERE  (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')

【讨论】:

    【解决方案3】:

    date_fielddatetime 类型吗?此外,您需要将较早的日期放在首位。

    应该是:

    SELECT * FROM `objects` 
    WHERE  (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')
    

    【讨论】:

      【解决方案4】:

      DATE() 是一个 MySQL 函数,它只提取日期或日期/时间表达式的日期部分

      SELECT * FROM table_name WHERE DATE(date_field) BETWEEN '2016-12-01' AND '2016-12-10';
      

      【讨论】:

      • 可以添加解释,以便人们了解您在做什么。
      【解决方案5】:

      作为@sabin 答案的扩展,以及如果只想比较 date 部分(没有时间)的提示:

      如果要比较的字段来自类型 datetime 并且仅指定 dates 进行比较,则这些 dates 在内部转换为 日期时间值。这意味着以下查询

      SELECT * FROM `objects` WHERE (date_time_field BETWEEN '2010-01-30' AND '2010-09-29')
      

      将转换为

      SELECT * FROM `objects` WHERE (date_time_field BETWEEN '2010-01-30 00:00:00' AND '2010-09-29 00:00:00')
      

      内部。

      这又会导致结果不包括时间值大于 00:00:00 的 2010-09-29 的对象!

      因此,如果还应包含日期为 2010-09-29 的所有对象,则必须将要比较的字段转换为日期:

      SELECT * FROM `objects` WHERE (DATE(date_time_field) BETWEEN '2010-01-30' AND '2010-09-29')
      

      【讨论】:

      • 感谢今天有用。
      【解决方案6】:

      您可以手动完成,通过比较大于或等于和小于或等于。

       select * from table_name where created_at_column  >=   lower_date  and  created_at_column <= upper_date;
      

      在我们的示例中,我们需要每天检索特定的数据。 我们将从一天的开始与另一天的最新一秒进行比较。

        select * from table_name where created_at_column  >=   '2018-09-01 00:00:00'  and  created_at_column <= '2018-09-05 23:59:59';
      

      【讨论】:

      • 这是最好的选择,因为 A)简单 B)可读性
      • 一天的开始和结束之间的比较对我来说很重要
      【解决方案7】:

      只需将 date_field 转换为日期

      SELECT * FROM `objects` 
      WHERE (cast(date_field as date) BETWEEN '2010-09-29' AND 
      '2010-01-30' )
      

      【讨论】:

      • 太棒了,花了将近 2 个小时搜索和尝试,但没有任何结果,但您的解决方案令人惊叹,非常感谢 :)
      【解决方案8】:

      使用日期时间值时,您必须将字段转换为DateTime 而不是Date。 试试看:

      SELECT * FROM `objects` 
      WHERE (CAST(date_field AS DATETIME) 
      BETWEEN CAST('2010-09-29 10:15:55' AS DATETIME) AND CAST('2010-01-30 14:15:55' AS DATETIME))
      

      【讨论】:

        【解决方案9】:

        可能是服务器端或客户端的日期配置问题。 当主机以西班牙语、法语或其他语言配置时,我发现这是多个数据库上的常见问题......这可能会影响 dd/mm/yyyy 或 mm/dd/yyyy 格式。

        【讨论】:

        • 问题是旧日期列在新日期之前。
        【解决方案10】:

        我花了将近 2 多个小时搜索并尝试仅显示 2 个特定日期之间的帖子,例如:

        一个场合从 (04-12) 开始并在 (04-14) 结束,而没有在查询中选择一年以使其每年在指定日期重复出现,所以我的目标是在 startdate 显示该场合并隐藏它自动在 enddate 如下:

        $stmt = $db->query(
        "SELECT *, 
        FROM table 
        
        WHERE (CAST(CURDATE() AS date) 
        
        BETWEEN 
        
        CAST(table.date_start AS date) 
        AND 
        CAST(table.date_end AS date)) 
        
        LIMIT 1"
        );
        

        现在,该场合仅在这些指定日期之间开始和消失,而不是之后或之前。希望对大家有所帮助,非常感谢:)

        【讨论】:

          【解决方案11】:

          尝试切换日期:

          2010-09-29 > 2010-01-30?
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-01-26
            • 2018-08-11
            • 1970-01-01
            • 1970-01-01
            • 2012-03-12
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多