mysql - 选择开始年份和开始月份到结束年份和结束月份之间的行?

Mah*_*not 2 mysql sql database

我试图选择给定范围的年和月的行.(即:从)<start year>+<start month><end year>+<end month>我尝试了下面的查询,但我得到了意想不到的行.我错过了什么吗?

SELECT * FROM table AS t
WHERE 
((YEAR(t.column1)='<start year>' AND MONTH(t.column1)>='<start month>') OR
(YEAR(t.column1)>'<start year>' AND YEAR(t.column1)<'<end year>') OR
(YEAR(t.column1)='<end year>' AND MONTH(t.column1)<='<end month>'))
Run Code Online (Sandbox Code Playgroud)

Dan*_*rth 5

如果开始年份和结束年份不同,您的查询只能正常工作.如果它们相同,则查询将返回该年份的所有行.你需要分开处理这个案子:

(
    start_year != end_year and 
    (
        (YEAR(t.column1)='<start year>' AND MONTH(t.column1)>='<start month>') OR  
        (YEAR(t.column1)>'<start year>' AND YEAR(t.column1)<'<end year>') OR  
        (YEAR(t.column1)='<end year>' AND MONTH(t.column1)<='<end month>')
    )
)
OR (start_year = end_year and MONTH(t.column1) >= start_month
                          and MONTH(t.column1) <= end_month)
Run Code Online (Sandbox Code Playgroud)

但是,这可以大大简化:

YEAR(t.column1) * 12 + MONTH(t.column1) >= start_year * 12 + start_month
and YEAR(t.column1) * 12 + MONTH(t.column1) <= end_year * 12 + end_month
Run Code Online (Sandbox Code Playgroud)

甚至更短的between:

YEAR(t.column1) * 12 + MONTH(t.column1)
BETWEEN start_year * 12 + start_month and end_year * 12 + end_month
Run Code Online (Sandbox Code Playgroud)

  • @Omesh:你是对的,这会让它更短.我通常会避免"介于"之间,因为对我而言,它听起来像是独家的,而实际上它是包容性的.我发现这令人困惑而且不够明确. (2认同)