在mysql中使用年和月字段检索范围内的记录

在mysql中使用年和月字段检索范围内的记录,sql,mysql,Sql,Mysql,我有一个mysql表,其中包含YEAR4和month TINYINT列。选择某一范围内所有记录(例如2009-10)的最佳方法是什么。。2010-02?使用: WHERE (year = 2009 AND month >= 10) OR (year = 2010 AND month <= 2) …或者,使用UNION ALL: SELECT t.* FROM TABLE t WHERE year = 2009 AND month >= 10 UNION ALL S

我有一个mysql表,其中包含YEAR4和month TINYINT列。选择某一范围内所有记录(例如2009-10)的最佳方法是什么。。2010-02?

使用:

WHERE (year = 2009 AND month >= 10)
   OR (year = 2010 AND month <= 2)
…或者,使用UNION ALL:

SELECT t.*
  FROM TABLE t
 WHERE year = 2009 AND month >= 10
UNION ALL
SELECT t.*
  FROM TABLE t
 WHERE year = 2010 AND month <= 2
UNION ALL比UNION快,但不会删除重复项。

使用:

WHERE (year = 2009 AND month >= 10)
   OR (year = 2010 AND month <= 2)
…或者,使用UNION ALL:

SELECT t.*
  FROM TABLE t
 WHERE year = 2009 AND month >= 10
UNION ALL
SELECT t.*
  FROM TABLE t
 WHERE year = 2010 AND month <= 2

联合所有都比联合更快,但不会删除重复。

< p>您可能需要考虑创建另一个名为“YeaYe月”的列,该列以YYYYMM格式存储日期,例如2010年2月的201002。确保在该列上创建索引,还可以创建两个触发器,在插入和更新时自动更新该列

然后您将能够使用:

WHERE year_month BETWEEN 200710 AND 201002

这将使用年月索引。

< p>您可能想考虑创建一个名为“年月”的列,该列以YYYYMM格式存储日期,例如2010年2月的201002。确保在该列上创建索引,还可以创建两个触发器,在插入和更新时自动更新该列

然后您将能够使用:

WHERE year_month BETWEEN 200710 AND 201002

这将使用年/月的指数。

这里是一个通用的解决方案:

Select...
From ...
Where ( Year = <StartYear> And Month >= <StartMonth> )
    Or ( Year > <StartYear> And Year < <EndYear> )
    Or ( Year = <EndYear> And Month <= <EndMonth> )

这是一个通用的解决方案:

Select...
From ...
Where ( Year = <StartYear> And Month >= <StartMonth> )
    Or ( Year > <StartYear> And Year < <EndYear> )
    Or ( Year = <EndYear> And Month <= <EndMonth> )

当开始日期和结束日期相同时,接受的答案不适用。例如2017-01年至2017-08年。涵盖此案例的修订psuedocode将是


年=开始日期和月份>=开始日期和月份或年>开始日期和年份=结束日期和月份接受的答案不适用于开始日期和结束日期相同的情况。例如2017-01年至2017-08年。涵盖此案例的修订psuedocode将是


年份=开始月份>=开始月份或年份>开始月份=结束年份和月份,但如果您从2007年10月到2010年2月有时间怎么办?您不能只替换日期。@Daniel Vassallo:我会将这些值存储为DATETIME,这将减轻您所建议的查询的复杂性。如果需要的话,我会创建一个视图来划分日/月/年。@OMG:是的,日期时间是理想的,但我认为OP没有日值。“只是一个月和一年。”丹尼尔:这是你的假设,而不是事实。让我们认为这是一个有根据的猜测:但是如果你从2007年10月到2010年2月呢?您不能只替换日期。@Daniel Vassallo:我会将这些值存储为DATETIME,这将减轻您所建议的查询的复杂性。如果需要的话,我会创建一个视图来划分日/月/年。@OMG:是的,日期时间是理想的,但我认为OP没有日值。仅仅是一个月和一年。@丹尼尔:这是你的假设,而不是事实。让我们把它看作是一个有根据的猜测:1701与1710不一样。阐明了这个例子,我指的是2017年01月1日和2017年10月10日,这是一个失败的例子。1701和1710不一样。澄清了这个例子,我的意思是2017年1月1日和2017年10月10日,这是一个失败的例子。请注意,year_month在mysql中是一个保留字,不能用作列名。请参考文档:请注意,year_month在mysql中是一个保留字,不能用作列名。请参阅以下文件: