【问题标题】:MySQL select records between day of the year and yearMySQL在一年中的某一天和一年之间选择记录
【发布时间】:2016-01-01 05:14:03
【问题描述】:

我有一个表格,我在其中插入年、月数、一年中的周数和一年中的天数。

我使用这些字段来过滤记录而不是完整日期,因为我有数百万条记录,我想通过比较整数而不是日期来提高性能。

我能够根据日期和年份选择日期之间的记录。如果年份相同,则查询效果很好,但是一旦我更改年份,查询就不起作用,因为我使用的是 AND。

表格如下:

  • 身份证
  • 年份
  • 完整日期

这是有效的查询

SELECT COUNT(id) AS records_count
FROM table1
WHERE table1.day >= 176
AND table1.day <= 275
AND table1.year <= 2015
AND table1.year >= 2015

这是我需要调整的查询

SELECT COUNT(id) AS records_count
FROM table1
WHERE table1.day >= 275
AND table1.day <= 176
AND table1.year <= 2014
AND table1.year >= 2015

【问题讨论】:

    标签: mysql sql date select date-range


    【解决方案1】:

    您存储日期的方法对于您想要做的事情是完全错误的。一般形式是:

    where (year = 2014 and day >= 275 or year > 2014) and
          (year = 2015 and day <= 176 or year < 2015)
    

    这适用于任何一对年份,而不仅仅是相隔一年的年份。

    现在,如果您正常存储日期,那么您只需这样做:

    where date >= makedate(2014, 275) and date <= makedate(2015, 176)
    

    这个结构真正非常好的地方在于 MySQL 可以使用date 上的索引。您的查询无法做到这一点。

    一般而言,在关系数据库中,使用整数而不是其他数据类型等微优化是不值得的。通常,读取数据的成本比在一行内处理要昂贵得多。而且,事实上,这个例子就是一个很好的例子。当您可以完全使用索引消除对比较的需求时,为什么还要尝试提高比较速度?

    【讨论】:

    • 作为一个魅力。谢谢!
    【解决方案2】:
    SELECT COUNT(id) AS records_count
    FROM table1
    WHERE (year = 2014 and day >= 275)
       OR (year = 2015 and day <= 176)
    

    正如 baao 所评论的 - 索引日期列超级快速且更易于查询。

    【讨论】:

    • OP 注意:此答案仅适用于相邻年份(或同一年)。它不能推广到任何一对日期。
    • 删除了我的评论,正如你所说的那样。
    【解决方案3】:

    广义解(例如可以从 2000 年到 2020 年)

    SELECT COUNT(id) AS cnt
    FROM tbl
    WHERE ((year > under_min_year and year < above_max_year)
          and ((year <> min_year and year <> max_year)
               or (year = min_year and day > 265)
               or (year = max_year and day < 300)))
    

    【讨论】:

      【解决方案4】:

      问题是您要计算年份小于或等于 2014 年且同一年份大于或等于 2015 年的记录。没有小于或等于 2014 年且同时大于或等于 2015 年的数字.

      【讨论】:

        猜你喜欢
        • 2013-08-27
        • 1970-01-01
        • 2020-08-28
        • 2020-07-11
        • 1970-01-01
        • 2013-08-17
        • 2015-04-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多