我有一个包含年份(YEAR(4)
)和月份(TINYINT
)列的mysql表。选择范围内所有记录的最佳方法是什么,例如2009-10 .. 2010-02?
答案 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 ALL
比UNION
快,但不会删除重复项。
答案 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))