使用LIKE运算符的C#DataView日期范围?

时间:2009-07-28 13:21:39

标签: c# dataview sql-like date-range

我有一个XML文件:

<SMS>
    <Number>+447761692278</Number>
    <DateTime>2009-07-27T15:20:32</DateTime>
    <Message>Yes</Message>
    <FollowedUpBy>Unassigned</FollowedUpBy>
    <Outcome></Outcome>
    <Quantity>0</Quantity>
    <Points>0</Points>
  </SMS>
  <SMS>
    <Number>+447706583066</Number>
    <DateTime>2009-07-27T15:19:16</DateTime>
    <Message>STOP</Message>
    <FollowedUpBy>Unassigned</FollowedUpBy>
    <Outcome></Outcome>
    <Quantity>0</Quantity>
    <Points>0</Points>
  </SMS>

我使用XMLReader将文件读入数据集并将其显示在datagridview中。 我希望能够指定一系列日期来显示数据。例如,元素包含INSERT DATE和&amp;之间的日期。 INSERT DATE。 为了做到这一点,我使用DATAVIEW,然后使用dataview而不是数据集填充datagridview。

目前我的方法如下:

public void DisplayRecSmsByDateRange(string date1,string date2, string readDir)
        {
            DataSet ds = new DataSet("SMS DataSet");
            XmlDataDocument xmlDatadoc = new XmlDataDocument();
            xmlDatadoc.DataSet.ReadXml(readDir);
            ds = xmlDatadoc.DataSet;

            DataView custDV = new DataView(ds.Tables["SMS"]);
            custDV.RowFilter = String.Format("(DateTime >= DateTime LIKE '{0}*' AND DateTime <= DateTime LIKE '{1}*')", EscapeLikeValue(date1), EscapeLikeValue(date2));
            this.dataGridView1.DataSource = custDV;
        }

问题在于,如果查看xml文件,该元素包含时间和日期。由于我对此元素的时间部分不感兴趣,因此我将使用“LIKE”语句仅根据元素的日期部分显示xml文件中的数据。因此,当我尝试执行布尔操作时,例如 - “显示2009-07-27和2009-07-30之间的日期数据”,我收到错误,因为编译器不喜欢我试图将LIKE运算符与布尔值&lt; =,&gt; =运算符组合在一起(在上面的方法中显示)。有没有解决的办法?我需要能够在一系列日期之间显示数据,但是使用LIKE运算符仅基于元素的第一部分进行搜索。

非常感谢,

亲切的问候。

4 个答案:

答案 0 :(得分:0)

我假设您可以修改/替换EscapeLikeValue()方法,以便它只返回日期部分,例如“2009-09-27”。这样您就可以将过滤器重写为:

custDV.RowFilter = String.Format("(DateTime >= '{0}' AND DateTime <='{1}')", EscapeLikeValue(date1) + "T00:00:00", EscapeLikeValue(date2) + "T23:59:59");

HTH, 德扬

答案 1 :(得分:0)

您可以这样做的一种方法是将日期字符串参数转换为实际的日期时间对象,如此

 DateTime dt = System.Convert.ToDateTime(date1);
 DateTime dt2 = System.Convert.ToDateTime(date2);
 dt2=dt2.AddDays(1);

然后你可以修改你的位置

custDV.RowFilter=String.Format("DateTime>={0} and DateTime<{1}",dt.ToShortDateString(),dt2.ToShortDateString());

答案 2 :(得分:0)

我想知道你是否可以做到以下几点:

custDV.RowFilter = String.Format("(Convert(DateTime,'System.DateTime' >= #{0}# AND Convert(DateTime,'System.DateTime' <= #{1}#)", EscapeLikeValue(date1), EscapeLikeValue(date2));

答案 3 :(得分:0)

对方法略有改动,删除LIKE算子......

public void DisplayRecSmsByDateRange(string date1,string date2, string readDir)
            {
                DataSet ds = new DataSet("SMS DataSet");
                XmlDataDocument xmlDatadoc = new XmlDataDocument();
                xmlDatadoc.DataSet.ReadXml(readDir);
                ds = xmlDatadoc.DataSet;

                DataView custDV = new DataView(ds.Tables["SMS"]);
                custDV.RowFilter = String.Format("(DateTime >= '{0}*' and DateTime <= '{1}*')", EscapeLikeValue(date1), EscapeLikeValue(date2));

                custDV.Sort = "DateTime";
                this.dataGridView1.DataSource = custDV;
            }