尝试使用正则表达式进行这种比较是不明智的。你会得到一个非常复杂的正则表达式,下次你看代码时你和其他人都不会理解。
相反,将字符串解析为它们的组件,然后对组件进行处理。这会生成更长的代码,但更容易遵循的代码。
您需要解析为第一个和最后一个日期的“跨度”表达式。让我在 SQL Server 中为您提供解决方案。我选择这种方言只是因为它对我来说更容易;我认为您可以很容易地将其调整为 mysql(日期和字符串的函数似乎在每个数据库中具有不同的名称)。
以下查询将列月 1、年 1、月 2 和年 2 添加到数据中:
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 年的所有月份吗?还是只是第一个月?