如何在一个字段中执行具有年份范围的MySQL查询

时间:2015-11-25 15:31:27

标签: mysql sql

我正在使用一个表,该表使用年份范围来处理我需要的一些数据 选择一年之间的记录。

| id | Make      | Model      | Year        |
|----------------|------------|------------ |
| 1  | Chevrolet | Camaro     | 2008        |
| 2  | Chevrolet | Camaro     | 2009 - 2014 |
| 3  | Dodge     | Avenger    | 2010 - 2015 |
| 4  | Dodge     | Challenger | 2008 - 2016 |   
| 5  | Ford      | Escape     | 2013        |
| 6  | Ford      | Mustang    | 2004 - 2012 |
| 7  | Ford      | Mustang    | 2015        |

例如,我希望能够 选择2012年的所有车辆

根据下面的示例表,这应该返回: 2 3 4 6

6 个答案:

答案 0 :(得分:2)

使用LEFTRIGHT来确定范围。

SELECT *
FROM yourtable
WHERE (LEFT(Year,4) <= '2012' AND RIGHT(Year,4) >= '2012')

输出:

id  Make        Model       Year
2   Chevrolet   Camaro      2009 - 2014
3   Dodge       Avenger     2010 - 2015
4   Dodge       Challenger  2008 - 2016
6   Ford        Mustang     2004 - 2012

SQL小提琴:

答案 1 :(得分:1)

text:list

答案 2 :(得分:0)

可能是这样的: 当然,如果所有具有年份范围的列都在相同的上下文中,则必须检查表,否则这将不起作用。

select *
from table
where (Year = '2012' and substring( Year, 6, 1) <> '-')
 or   (  substring(Year, 6, 1) = '-'
     and substring(Year, 1, 4) <= '2012')
     and substring(Year, 8, 4) >= '2012'))

答案 3 :(得分:0)

如果保证Year列始终有一年或两年,那么您可以执行以下操作:

SELECT
    *
FROM
    `my_table`
WHERE
    CAST(LEFT(`Year`, 4) AS SIGNED) <= 2012
    AND CAST(RIGHT(`Year`, 4) AS SIGNED) >= 2012

这会捕获包含20122000 - 2015等等的列

答案 4 :(得分:0)

您可以使用LEFT/RIGHT

来使用get start和end year
SELECT *
FROM (
  SELECT *, CAST(LEFT(Year, 4) AS INT) AS s, CAST(RIGHT(Year,4) AS INT) AS e
  FROM tab
) AS sub
WHERE sub.s <= 2012 AND sub.e  >= 2012;

LiveDemo

答案 5 :(得分:0)

为此,我首先尝试重构数据库,以便在最大和最小年份有两个单独的字段。但是,有时候我们会遇到别人糟糕的设计决定。在这种情况下,使用静默转换的substring_index()非常有用:

select t.*
from t
where 2012 >= (year + 0) and -- does silent conversion on the first value in the field
      2012 <= (substring_index(year, ' - ', -1) + 0);

如果您将年份作为字符串输入,则不需要静默转换:

select t.*
from t
where '2012' >= substring_index(year, ' - ', 1) and
      '2012' <= substring_index(year, ' - ', -1);