尝试比较DataView.RowFilter中的日期

时间:2019-07-15 10:05:11

标签: c# .net

我有一个带2个日期字段的DataView,这是露营开始和结束的日子。

用户通过textBox引入了一个年份,我想要一个过滤器,该过滤器仅返回满足以下条件的野营:

1。从该年开始

OR

2。该年结束

OR

3。在该年之前开始并在该年之后结束

例如,如果我有一个露营地开始于2018年并结束于2021年,则当用户搜索2018、2019、2020或2021年时应返回该露营地。

现在,我要做的代码如下:

 import android.app.Activity;
public class LoginActivity extends Activity {

  try {
        CompletableFuture<Response<?>> response = TransportService.doLogin("email", "pass", false);
        if (BuildConfig.DEBUG)
            Log.d(TAG, "login_response = " + response);
        if (response.get().isSuccessful()) {
            Toast.makeText(getApplicationContext(), "Success reponse", Toast.LENGTH_SHORT).show();
        }
    } catch (ExecutionException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

这个有点混乱的代码的结果字符串如下:

 string x = String.Format(

 "Convert(begin_date, 'System.String') LIKE '*/{0}*' " +
 "OR " +
 "Convert(end_date, 'System.String') LIKE '*/{0}*' " +
 "OR " +
 "(begin_date < #{1}# AND end_date > #{2}#)",
 yearFilter_textBox.Text,
 new DateTime(Convert.ToInt32(yearFilter_textBox.Text), 1, 1).ToShortDateString(),
 new DateTime(Convert.ToInt32(yearFilert_textBox.Text), 12, 31).ToShortDateString());

 campingsDataView.RowFilter = x;

此代码的想法是,我通过将DataView上的日期字段转换为字符串来应用前两个条件,然后使用运算符LIKE来检查该日期上的年份与用户引入的年份相同。效果很好,问题不在这里。

问题在于应用第三个条件。为此,我只想将日期字段与用户介绍的一年中的第一天和最后几天进行比较。现在,这将引发FormatException(字符串不能识别为有效的DateTime值)。

据我所知,您可以使用这种ShortDateTimeString格式比较RowFilter上的日期,所以我不知道为什么会出错。

1 个答案:

答案 0 :(得分:0)

建议使用linq对其进行数据表处理,使您的工作变得轻松

var filter = testTable.AsEnumerable().
                       Where(x => x.Field<string>("begin_date").Contains( "2019") || 
                                  x.Field<string>("end_date").Contains( "2019"));