SQL Server / C#: фильтр для System.Date - результаты только записи в 00:00:00
У меня есть подключенная база данных SQL Server в Visual Studio, и я отображаю ее содержимое в виде сетки. Я создал раскрывающееся меню с именами столбцов в качестве выбираемых параметров и текстовым полем для фильтрации определенного содержимого, например, DropDown = "Start" - Textfield = 14.03.2015 = Фильтровать столбец "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# и в этом отношении программирование само по себе. Я надеюсь, что есть кто-то, кто сможет мне помочь.
2 ответа
Что произойдет, если вы измените все фильтры на "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);
}
Обратите внимание, что версия ищет записи меньше, чем указанная вами дата "плюс один день".
Лично я бы использовал сценарий "Обновление 1" и сравнил даты с 23:59:59, хотя, да, он игнорировал бы записи, созданные в эту последнюю секунду дня (например, в 23:59:59.403).
Проблема связана с тем, что вы фильтруете значение datetime; если вы установите только часть даты, система интерпретирует ее как полночь. Попробуйте также передать значение времени, и оно будет работать.
РЕДАКТИРОВАТЬ: проблема из-за преобразования из строки и даты и времени:
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'