SQL查询根据month_year获取行

时间:2012-05-19 06:30:22

标签: php mysql sql

我有一个名为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

2 个答案:

答案 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”以适应其他价值观。虽然这看起来很明显,但必须有更多的东西吗?!