SQL Server / C#:Filter for System.Date - 仅在00:00:00生成条目

时间:2015-06-22 07:42:18

标签: c# asp.net sql-server date gridview-sorting

我在Visual Studio中有一个连接的SQL Server数据库,并在网格中显示其内容。我创建了一个下拉菜单,其中列名称为可选选项,文本字段用于过滤特定内容,例如,DropDown =“Start” - Textfield = 14.03.2015 =筛选列“开始”,表示包含“14.03.2015”的每个条目“ - 并将其显示在网格中。

我基本上完成了那部分。我所面临的唯一问题是每当我输入日期时 - 例如,14.03.2015它只显示从00:00:00开始的日期 - 其他不在00:00:00开始的条目将被忽略,我无法弄清楚如何修改它才能正常工作。

网格看起来像这样:http://abload.de/img/untitled123yqkyn.png

我正在使用以下C#代码进行过滤:

protected void Button1_Click(object sender, EventArgs e)
{
    string FilterExpression = string.Empty;

    if (DropDownList1.SelectedValue.ToString().Equals("Start"))
    {
        FilterExpression = string.Format("Start  = '{0}'", TextBox1.Text);
    }
    else if (DropDownList1.SelectedValue.ToString().Equals("End"))
    {
        FilterExpression = string.Format("End  = '{0}'", TextBox1.Text);
    }
    else if (DropDownList1.SelectedValue.ToString().Equals("Creation Time"))
    {
        FilterExpression = string.Format("DateTimeCreated = '{0}'", TextBox1.Text);
    }
    else if (DropDownList1.SelectedValue.ToString().Equals("Last Modified"))
    {
        FilterExpression = string.Format("LastModifiedTime = '{0}'", TextBox1.Text);
    }
    else
    {
        FilterExpression = string.Concat(DropDownList1.SelectedValue, " Like '%{0}%'");
    }

    SqlDataSource1.FilterParameters.Clear();
    SqlDataSource1.FilterParameters.Add(new ControlParameter(DropDownList1.SelectedValue, "TextBox1", "Text"));
    SqlDataSource1.FilterExpression = FilterExpression;
}

这是我的网格:

              
                 组织者         房间         创作时间         开始         结束         最后修改          

    <asp:TextBox ID="TextBox1" runat="server" Width="315px"></asp:TextBox> &nbsp;
    <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Search" Width="100px"/> &nbsp;
    <asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="Reset Search" Width="100px"/>
    <br/>
    <br/>

    <asp:GridView ID="GridView1" runat="server" BorderColor="#F9F9F9" BorderStyle="Solid" CellPadding="4" ForeColor="#333333" AutoGenerateColumns="False" DataKeyNames="ID" DataSourceID="SqlDataSource1" AllowSorting="True"  pagesize="1000" AllowPaging="True" HorizontalAlign="Center">
    <AlternatingRowStyle BackColor="White"/>

        <Columns>
        <asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" ReadOnly="True" SortExpression="ID" ItemStyle-HorizontalAlign="Center"/>
        <asp:BoundField DataField="Organizer" HeaderText="Organizer" SortExpression="Organizer" ConvertEmptyStringToNull="False" HtmlEncode="False" HtmlEncodeFormatString="False" InsertVisible="False"/>
        <asp:BoundField DataField="Room" HeaderText="Room" SortExpression="Room"/>
        <asp:BoundField DataField="DateTimeCreated" HeaderText="Creation Time" SortExpression="DateTimeCreated"/>
        <asp:BoundField DataField="Start" HeaderText="Start" SortExpression="Start" />
        <asp:BoundField DataField="End" HeaderText="End" SortExpression="End"/>
        <asp:BoundField DataField="LastModifiedTime" HeaderText="Last Modified" SortExpression="LastModifiedTime" />
        <asp:CheckBoxField DataField="Cancelled" HeaderText="Cancelled" SortExpression="Cancelled" ItemStyle-HorizontalAlign="Center" />
        </Columns>

    <EditRowStyle BackColor="#2461BF"/>
    <FooterStyle BackColor="#E1000F" Font-Bold="True" ForeColor="White"/>
    <HeaderStyle BackColor="#E1000F" Font-Bold="True" ForeColor="White" Font-Underline="false"/>
    <PagerStyle BackColor="#E1000F" ForeColor="White" HorizontalAlign="Center"/>
    <RowStyle BackColor="#F9F9F9"/>
    <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333"/>
    </asp:GridView>

    <asp:SqlDataSource ID="xyz" runat="server" ConnectionString="<%$ ConnectionStrings:VCConnectionString %>" SelectCommand="SELECT * FROM [xyz]"></asp:SqlDataSource>
 </center>

请原谅代码的质量,我对C#完全不熟悉,也就是编程本身。我希望有人能够帮助我。

2 个答案:

答案 0 :(得分:1)

如果您更改所有过滤器以使用&#39; LIKE&#39;会发生什么?

if (DropDownList1.SelectedValue.ToString().Equals("Start"))
{
    FilterExpression = string.Format("Start LIKE '{0}%'", TextBox1.Text);
}

然后,您没有与确切日期(午夜)匹配,而是匹配开始与该日期的任何日期时间。

<强>更新

或许你可以试试这个......

if (DropDownList1.SelectedValue.ToString().Equals("Start"))
{
    FilterExpression = string.Format("Start >= '{0} 0:00:00' AND Start <= '{1} 23:59:59'", TextBox1.Text, TextBox1.Text);
}

更新2

...或者,如果你确实想要确保你从23:59:59的最后一秒获得所有记录,你可以使用它(我认为)......

if (DropDownList1.SelectedValue.ToString().Equals("Start"))
{
    FilterExpression = string.Format("Start >= '{0} 0:00:00' AND Start < DATEADD(day,1,'{1}')", TextBox1.Text, TextBox1.Text);
}

请注意,该版本会查找小于您指定日期的记录&#34;加上一天&#34;。

就个人而言,我会使用&#34; Update 1&#34;脚本,并将日期与23:59:59进行比较,即使是,它会忽略在当天最后一秒创建的记录(例如23:59:59.403)。

答案 1 :(得分:0)

问题是由于您对日期时间值进行了过滤;如果您只设置日期部分,系统将其解释为午夜。尝试传递时间值,它会起作用。

编辑: 问题是由于字符串和日期时间的转换:

   else
    {
        FilterExpression = string.Concat(DropDownList1.SelectedValue, " Like '%{0}%'");
    }

或许更改逻辑以将值用作日期时应该有效。 在下面的例子中,第一个不起作用,第二个起作用:

SELECT * 
FROM [Events]
WHERE EventDate LIKE '%2012-06-08%'
SELECT * 
FROM [Events]
WHERE EventDate >= '2012-06-08' AND EventDate <= '2012-06-08 23:59:59'