我正在使用一个表,该表使用年份范围来处理我需要的一些数据 选择一年之间的记录。
| 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 。
答案 0 :(得分:2)
使用LEFT
和RIGHT
来确定范围。
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
这会捕获包含2012
或2000 - 2015
等等的列
答案 4 :(得分:0)
您可以使用LEFT/RIGHT
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);