如何使用RowFilter

时间:2018-01-26 16:56:55

标签: c# sql datetime

我的SQL表中有一个字段

`OurDate (varchar(250), null)`
//sample dates
//  01/18/2018
//  05/12/2016
//  03/05/2012

我正在尝试使用RowFilter比较该字段列中两个日期之间的表数据:

string fromDate = "{OurDate Sql column value from dropdown list}"; //01/18/2018
string toDate =  "{OurDate Sql column value from dropdown list}"; //01/18/2018 (could be different, if someone doesn't want same day)
dataTable.DefaultView.RowFilter = string.Format("(CONVERT({0}, 'System.DateTime') >= #" + Convert.ToDateTime(fromDate) + "# And {0} <= #" + Convert.ToDateTime(toDate) + "# )", "OurDate");

我收到此错误:

String was not recognized as a valid DateTime.

有人可以协助我解决这个问题。

3 个答案:

答案 0 :(得分:1)

首先,您应该确定导致转换问题的原因。 是CONVERT表达式还是用于过滤的值。

您可以通过拆分代码并为转换添加表达式列来完成此操作:

dataTable.Columns.Add("TEST", typeof(DateTime), "CONVERT(OurDate, 'System.DateTime')");

如果此行导致错误 - 则表示问题是转换数据。 DataExpression CONVERT函数应基于dataTable.Locale (which defaults to CultureInfo.CurrentCulture)属性。 如果您的数据确实始终在&#34; MM / dd / yyyy&#34;格式设置为

dataTable.Locale = new CultureInfo("en-US");

应解决问题 - 如果表格中的数据格式不一致 - 您将无法使用RowFilter / DataExpressions解决此问题

此时您会注意到您的第二个过滤条件完全没有CONVERT。

事实上,如果您的所有数据格式正确,则整个转化步骤肤浅 - 如果RowFilter检测到其正确的日期时间格式 - 它会自动将此转化应用于您的列。

据说.RowFilter只接受以下格式的日期 美国&#34; MM / dd / yyyy&#34; &#34; yyyy / MM / dd&#34; (我猜这里被认为是不变的?)

如果您的本地格式不是其中之一Convert.ToDateTime(fromDate),则会导致转换失败。 由于你的字符串已经采用了一种可接受的格式 - 无论如何,调用它应该只是一次毫无意义的往返。

TL; DR:假设所有格式都正确,这应该有效:

dataTable.DefaultView.RowFilter = $"OurDate >= #{fromDate}# And OurDate <= #{toDate}#";

如果您的行具有不同的格式,那么您需要更多控制的内容 - 我建议将 LINQ to DataSet 作为最简单的方法,因为您可以使用 LINQ to DataSet 用它返回DataViews / DataTables

答案 1 :(得分:0)

尝试使用此而不是ConvertTo:

DateTime.ParseExact(myStr, "MM/dd/yyyy", CultureInfo.InvariantCulture);

我在How convert string to Datetime by a format?找到了它并稍微更改了语法以适应您的数据库值&#39;格式。

答案 2 :(得分:0)

你也可以这样使用;

我认为这比rowfilter更具可读性;

      static void Main(string[] args)
    {
        string givenDateString = "01/26/2018";

        DateTime convertedDateFromString = new DateTime();
        DateTime.TryParse(givenDateString, out convertedDateFromString);

        DataTable dt = new DataTable();
        dt.Columns.Add("OurDate", typeof(System.DateTime));

        DataRow dR = dt.NewRow();
        dR["OurDate"] = DateTime.Now;

        dt.Rows.Add(dR);

        //way 1
        var result = from d in dt.AsEnumerable().ToList()
                     where d.Field<DateTime>("OurDate").Date == convertedDateFromString.Date
                     select d;

        Console.WriteLine(result.FirstOrDefault()["OurDate"].ToString());

        //way 2
        var result2 = from d in dt.AsEnumerable()
                      where d.Field<DateTime>("OurDate").Date == convertedDateFromString.Date
                      select d;
        //result.FirstOrDefault<DataRow>[""];
        Console.WriteLine(result2.FirstOrDefault<DataRow>()["OurDate"].ToString());

    }