0

データベースには project_start と project_end の 2 つの列があり、レポート (ASP でコード化) を介して 2 つのフィールド (両方ともオプション) を渡しています。

以下の疑似コードは、私が現在持っているものです。

(project_start <= search_start AND project_end <= search_start)

(プロジェクト開始 <= 検索終了 AND プロジェクト終了 >= 検索終了)

ただし、上記で取り上げられていないのは、開始日より前に開始され、開始日より後に終了するプロジェクト、開始日より後に開始され、終了日より後に終了するプロジェクト、および開始日より前に開始されて終了するプロジェクトです。終了日以降:S

以下は私のコードです:

if (Request.QueryString["DateFrom"] != null && Request.QueryString["DateFrom"] != "")
        {
            DateTime dateFromFilter;

            dateFromFilter = DateTime.Parse(Request.QueryString["DateFrom"]);

            Q = from qua in qTable
                    where qua.Start_Date.Date <= dateFromFilter.Date
                    && qua.End_Date.Date >= dateFromFilter.Date
                    select qua;
        }

        //filter to date
        if (Request.QueryString["DateTo"] != null && Request.QueryString["DateTo"] != "")
        {
            DateTime dateToFilter;

            dateToFilter = DateTime.Parse(Request.QueryString["DateTo"]);

            Q= from qua in qTable
                    where qua.Start_Date.Date <= dateToFilter.Date
                    && qua.End_Date.Date >= dateToFilter.Date
                    select qua;
        }
4

2 に答える 2

3

検索範囲の一部と重複するプロジェクトが必要な場合は、これを試してください。

project_start <= search_end AND project_end >= search_start

「単純すぎる」ように見えることはわかっていますが、実際にはすべてのケースをカバーしています。

  • 両端の部分的なオーバーラップ
  • プロジェクトが完全に検索範囲内にある
  • 検索範囲は完全にプロジェクト内にあります。

アップデート

オプションのパラメータを処理するには:

(search_end IS NULL OR project_start <= search_end) AND
(search_start IS NULL OR project_end >= search_start)
于 2012-08-02T10:14:53.563 に答える
0

確かにあなたは欲しい:

(project_start >= search_start AND project_end >= search_start)
AND
(project_start <= search_end AND project_end <= search_end)

project_end > project_start と仮定すると、これは次のように簡略化できます。

project_start >= search_start AND project_end <= search_end

両方の検索パラメーターがオプションであると言います。その場合、search_start のデフォルトを DateTime.MinValue に、search_end のデフォルトを DateTime.MaxValue にします。

于 2012-08-02T10:19:24.783 に答える