0

我有一个现有的 MySQL 数据库,其中有一列名为 month_year。它的日期/时间数据格式如下:- 1974 - 1982、11/2001 - 2008、03/2007 至 1987 年和 11/2001 - 02/2007。

我的网站用户将选择一个日期,我需要根据该日期是否符合 DB 中的标准给他一些选项。

例如:

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 月(十月)。现在我必须根据他的意见给他选择。我将不得不获取所有月年列满足这一点的行。

列如下所示:

月年

1974 - 1982
1988 - 10/1999
1988 - 10/1999
11/1999 - 10/2001
11/2001 - 2008
11/2001 - 2008
4

2 回答 2

1

尝试使用正则表达式进行这种比较是不明智的。你会得到一个非常复杂的正则表达式,下次你看代码时你和其他人都不会理解。

相反,将字符串解析为它们的组件,然后对组件进行处理。这会生成更长的代码,但更容易遵循的代码。

您需要解析为第一个和最后一个日期的“跨度”表达式。让我在 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 年的所有月份吗?还是只是第一个月?

于 2012-05-19T11:44:03.950 回答
0

你有没有尝试过

SELECT * FROM table WHERE month_year="1974 - 1982"

更改“1974 - 1982”以适应其他值。虽然这看起来很明显,但肯定还有更多的东西?!

于 2012-05-19T07:19:34.093 回答