我有一个名为month_year的现有MySQL数据库。它有以下格式的日期/时间数据: - 1974 - 1982,11 / 2001 - 2008,03 / 2007,直到1987年和11/2001 - 02/2007。
我的网站用户会选择一个日期,我需要给他一些选项,具体取决于该日期是否符合数据库中的条件。
例如:
up to 1987 in DB means all dates upto 1987
11/2001 - 2008 means all dates between this
03/2007 on - means all dates after this.
我需要一个SQL查询来获取符合此条件的所有行。我想我需要一些正则表达式才能实现这个目标,但我不确定。任何帮助都会很棒!
提前致谢。
已添加:我无法更改数据库。用户将选择年份 2011 &月 10(10月)。现在我必须根据他的意见给他选择。我将不得不获取其month_year列满足此行的所有行。
列看起来像这样:
MONTH_YEAR
1974 - 1982
1988 - 10/1999
1988 - 10/1999
11/1999 - 10/2001
11/2001 - 2008
11/2001 - 2008
答案 0 :(得分:1)
尝试使用regexp进行此比较是不明智的。您将获得一个非常复杂的正则表达式,下次您查看代码时,您和其他任何人都无法理解。
相反,将字符串解析为其组件,并对组件进行处理。这会生成更长的代码,但可以更容易地遵循代码。
您有一个“span”表达式需要解析为第一个和最后一个日期。让我在SQL Server中为您提供解决方案。我选择这种方言只是因为它对我来说更容易;我认为你可以很容易地将它改编为mysql(日期和字符串的函数似乎在每个数据库中都有不同的名称)。
以下查询将month1,year1,month2和year2列添加到数据中:
select t.*,
(case when charindex('/', part1) > 0 -- have month or not?
then cast(left(part1, charindex('/', part1)) as int)
else 1
end) as Month1,
(case when charindex('/', part1) > 0 -- have month or not?
then cast(substring(part1, charindex('/', part1), 100) as int)
else cast(part1 as int)
end) as Year1,
(case when charindex('/', part2) > 0 -- have month or not?
then cast(left(part2, charindex('/', part2)) as int)
else 1
end) as Month2,
(case when charindex('/', part2) > 0 -- have month or not?
then cast(substring(part2, charindex('/', part2), 100) as int)
else cast(part2 as int)
end) as Year2
from (select t.*,
left(t.span, charindex(t.span, '-')-2) as part1,
substring(t.span, charindex(t.span, '-')+2) as part2
from t
)
您现在可以使用这些表达式进行所需的比较。有一点需要注意:多年和几年的混合可能会产生意想不到的结果。当用户指定类似9/2008 - 2010的东西时,您需要特别小心。这是2010年的所有月份吗?或者只是第一个月?
答案 1 :(得分:0)
你试过吗
SELECT * FROM table WHERE month_year="1974 - 1982"
改变“1974 - 1982”以适应其他价值观。虽然这看起来很明显,但必须有更多的东西吗?!