0

month_year という列を持つ既存の MySQL データベースがあります。次のような形式の日付/時刻データがあります

私のウェブサイトのユーザーは日付を選択し、その日付が 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 月 (10 月)を選択します。今、私は彼の意見に基づいて彼に選択肢を与えなければなりません。month_year 列がこれを満たすすべての行をフェッチする必要があります。

列は次のようになります。

month_year

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にすんなり適応できると思います(日付や文字列の関数はデータベースごとに名前が違うようです)。

次のクエリは、列 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
     )

これらの式を使用して、必要な比較を行うことができます。1 つの注意点があります。年と年と月を混在させると、予期しない結果が生じる可能性があります。ユーザーが 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 に答える