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

时间:2010-02-28 00:51:36

标签: sql mysql

我有一个包含年份(YEAR(4))和月份(TINYINT)列的mysql表。选择范围内所有记录的最佳方法是什么,例如2009-10 .. 2010-02?

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

使用:

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 ALLUNION快,但不会删除重复项。

答案 2 :(得分:1)

您可能需要考虑创建另一个名为year_month的列,该列以YYYYMM格式存储日期,例如2010年2月的201002。确保在其上创建索引,并且您还可以创建两个触发器来自动更新ON INSERT和ON UPDATE列。

然后你就可以使用:

WHERE year_month BETWEEN 200710 AND 201002

这将使用year_month上的索引。

答案 3 :(得分:1)

当StartYear和EndYear相同时,接受的答案不起作用。例如。 2017-01至2017-08。修改后的伪造的代码将是

((year = StartYear and month&gt; = StartMonth)OR(year&gt; StartYear))AND((year = EndYear and month&lt; = EndMonth)OR(year&lt; EndYear))