SQL 服务器/C#:过滤 System.Date - 仅结果 00:00:00 处的条目
SQL Server / C# : Filter for System.Date - results only entries at 00:00:00
我在 Visual Studio 中连接了一个 SQL 服务器数据库,并在网格中显示其内容。我创建了一个下拉菜单,其中列名作为可选选项和一个用于过滤特定内容的文本字段,例如,DropDown = "Start" - Textfield = 14.03.2015 = Filter Column "Start" 每个包含的条目“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>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Search" Width="100px"/>
<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# 和编程本身是全新的。我希望有人能帮助我。
问题是由于您过滤的是日期时间值;如果您只设置日期部分,系统会将其解释为午夜。尝试也传递时间值,它将起作用。
编辑:
问题是由于字符串和日期时间的转换:
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'
如果将 所有 过滤器更改为使用 'LIKE':
会发生什么
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);
}
请注意,该版本查找 小于 您给定日期 "plus one day" 的记录。
就我个人而言,我会使用 "Update 1" 脚本,并将日期与 23:59:59 进行比较,尽管它会忽略当天最后一秒创建的记录(例如在 23:59:59.403).
我在 Visual Studio 中连接了一个 SQL 服务器数据库,并在网格中显示其内容。我创建了一个下拉菜单,其中列名作为可选选项和一个用于过滤特定内容的文本字段,例如,DropDown = "Start" - Textfield = 14.03.2015 = Filter Column "Start" 每个包含的条目“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>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Search" Width="100px"/>
<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# 和编程本身是全新的。我希望有人能帮助我。
问题是由于您过滤的是日期时间值;如果您只设置日期部分,系统会将其解释为午夜。尝试也传递时间值,它将起作用。
编辑: 问题是由于字符串和日期时间的转换:
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'
如果将 所有 过滤器更改为使用 'LIKE':
会发生什么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);
}
请注意,该版本查找 小于 您给定日期 "plus one day" 的记录。
就我个人而言,我会使用 "Update 1" 脚本,并将日期与 23:59:59 进行比较,尽管它会忽略当天最后一秒创建的记录(例如在 23:59:59.403).