0

我在数据库中有两列,project_start 和 project_end,我正在通过报告(用 ASP 编码)传递两个字段(都是可选的)。

下面的伪代码是我目前拥有的:

(project_start <= search_start AND project_end <= search_start)

(project_start <= search_end AND project_end >= search_end)

但是,上面没有提到的是在开始日期之前开始但在开始日期之后结束的项目,在开始日期之后开始但在结束日期之后结束的项目,以及在开始日期之前开始并结束的项目结束日期之后: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 回答