【问题标题】:SQL query selecting between two datesSQL 查询在两个日期之间进行选择
【发布时间】:2012-03-12 21:34:38
【问题描述】:

我想选择两个日期之间的记录 - startDate 和 endDate(它们是 sql 中的日期/时间格式)。我有以下 sql 查询,但它不起作用,有人能告诉我我做错了什么吗?

SELECT * 
FROM house 
WHERE startDate >= '2012/02/22 00:00:00' AND endDate <= '2012-02-25 00:00:00'

【问题讨论】:

  • 查询不起作用怎么办?返回错误?返回太多记录?不返回任何记录?
  • 首先,尽量不要混用日期时间格式。格式化日期以供 SQL 理解的最安全方法是使用 '2012-feb-22 00:00:00 之类的内容,因为这样就不会混淆日/月顺序。
  • 您使用斜线和破折号格式化日期一次。
  • 我认为格式更好:'2012-02-25 00:00:00'。它更容易排序,它在 mysql 中是默认的。
  • 谢谢你们,这是格式错误,我将“/”更改为“-”,现在可以使用了。非常感谢!

标签: sql


【解决方案1】:

我建议将日期转换为日期时间并进行比较,同时保持日期标准和一致。比如:

"SELECT * 
FROM house 
WHERE DATE(startDate) >= DATE('2012-02-22 00:00:00') 
  AND DATE(endDate) <= DATE('2012-02-25 00:00:00')"

注意:我假设您的 startDate 和 endDate 与您提供的字符串格式相同。

【讨论】:

    【解决方案2】:

    您想要startDate'2012-02-22' 或更高版本并且endDate'2012-02-22' 或之前的所有行吗?然后,使用这个:

    SELECT * 
    FROM house 
    WHERE startDate >= '2012-02-22' 
      AND endDate < '2012-02-26'           --- notice the `<`, not `<=`
                                           --- and the `day+1`
    

    在 SQL 产品中使用日期时,最好在查询和语句中使用这种格式:'20120222' 或这个(我觉得更容易阅读:'2012-02-22'

    不建议使用像'2012/02/22' 这样的斜线或Year-Month-Day 以外的任何其他顺序。

    不需要包含时间部分。 '2012-02-22 00:00:00''2012-02-22' 相同。

    使用endDate &lt;= '2012-02-25 00:00:00' 表示日期为 2012 年 2 月 25 日但时间在午夜之后的任何行 ('00:00:00') 将不匹配条件。如果您也想要这些行,请改用endDate &lt; '2012-02-26'

    您可以使用DATE(endDate) &lt;= DATE('2012-02-25 00:00:00')DATE(endDate) &lt;= '2012-02-25',但这些条件是“不可分割的”,因此您的查询将无法使用endDate 上的索引。

    【讨论】:

      【解决方案3】:

      MySql 中有内置的STR_TO_DATE 函数,它采用与date_format 相同的格式掩码。

      start_date >= str_to_date('2012/02/22 00:00:00','%Y/%m/%d %h:%i:%s)
      

      【讨论】:

        【解决方案4】:

        我猜这就是类型转换问题它正常工作的原因,因为您在 where 子句中匹配的输入不同,即该列是日期或日期时间类型,并且您正在匹配手动字符串格式,或者使用 @987654321 @在哪里匹配右侧的格式或在右侧使用to_date()

           SELECT * 
            FROM house 
           WHERE 
            to_char(startDate, 'YYYY/MM/DD
              24hh:mm:ss')>= 
             '2012/02/22  00:00:00' 
                 AND to_char(endDate, 
              'YYYY/MM/DD
              24hh:mm:ss') <= '2012-02-25 
                00:00:00'
        

        【讨论】:

          猜你喜欢
          • 2015-04-01
          • 2011-07-04
          • 1970-01-01
          • 1970-01-01
          • 2013-02-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多