фильтр даты с таблицами в asp.net - PullRequest
0 голосов
/ 17 марта 2020

Мне нужно отфильтровать дату в столбце «DATEATTEND» с таблицами данных, и это то, что я уже пробовал:

                 <div class="card-body">
                                <h4 class="card-title">DAILYDATA</h4>

                                <div class="table-responsive">
                                 <asp:TextBox ID="txtDate" runat="server" TextMode="Date" />
                                 <br />
                                 <br />
                                <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
                                <br />
                                <br />                               
                                 <asp:Repeater ID="rptrDAILYDATATemplate" runat="server">
                                    <HeaderTemplate>
                                      <table id="myTable"
                                        class="table table-striped table-bordered no-wrap" style="width:100%">
                                            <thead>
                                                <tr>
                                                    <th>NIP</th>
                                                    <th>NAME</th>
                                                    <th>DEPARTMENT</th>
                                                    <th>DATEATTEND</th>
                                                    <th>STATUSTYPE</th>
                                                </tr>
                                            </thead>
                                            <tbody>
                                    </HeaderTemplate>
                                    <ItemTemplate>
                                        <tr>

                                            <td><%# DataBinder.Eval(Container.DataItem, "NIP") %></td>
                                            <td><%# DataBinder.Eval(Container.DataItem, "NAME")%></td>
                                            <td><%# DataBinder.Eval(Container.DataItem, "DEPARTMENT") %></td>
                                            <td><%# DataBinder.Eval(Container.DataItem, "DATEATTEND") %></td>
                                            <td><%# DataBinder.Eval(Container.DataItem, "STATUSTYPE") %></td>
                                        </tr>
                                    </ItemTemplate>
                                    <FooterTemplate>

                                            </tbody>
                                        </table>
                                    </FooterTemplate>
                                  </asp:Repeater>
                                </div>
                            </div>

   protected void Button1_Click(object sender, EventArgs e)
        {
            String CS = ConfigurationManager.ConnectionStrings["MANHOURConnectionString"].ConnectionString;
            SqlConnection con = new SqlConnection(CS);
            using (SqlCommand cmd = new SqlCommand("SELECT * FROM DAILYDATA WHERE LEFT(DATEATTEND,11)=@DATEATTEND", con))
            {
                using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
                {


                    cmd.Parameters.AddWithValue("@DATEATTEND", txtDate.Text);
                    con.Open();

                    DataTable dtDaily = new DataTable();


                    sda.Fill(dtDaily);


                    rptrDAILYDATATemplate.DataSource = dtDaily;
                    rptrDAILYDATATemplate.DataBind();
                    con.Close();
                }
            }

        }

, когда я запускаю его, кажется, работает ... но моя проблема в том, что когда я фильтрую, согласно дате в моей базе данных, появляется сообщение "нет данных", и я уверен, что у меня есть эта дата в моей базе данных. Почему это не работает?


столбец DATEATTEND имеет тип данных datetime, например значение в этом столбце 2020-03-21 08:00:00, и я просто хочу взять только 2020-03-21, поэтому я использовал LEFT функция.

1 Ответ

1 голос
/ 17 марта 2020

Возможно, проблема в том, что вы используете LEFT для типа данных datetime. LEFT для строк, а не для типов данных даты и времени. Использование LEFT для других типов данных дает «странные» (но ожидаемые) результаты. Например:

SELECT LEFT(CONVERT(datetime,'20190317'),11) dt_1,
       LEFT(CONVERT(date,'20190317'),11) d_1,
       LEFT(CONVERT(datetime2,'20190317'),11) dt2_1,
       LEFT(CONVERT(datetime,'2019-03-17T16:12:19.134'),11) dt_2,
       LEFT(CONVERT(datetime2,'2019-03-17T16:12:19.134'),11) dt2_2;

Возвращает:

dt_1        d_1        dt2_1        dt_2        dt2_2
----------- ----------- ----------- ----------- -----------
Mar 17 2019 2019-03-17  2019-03-17  Mar 17 2019 2019-03-17 

Вероятно, это приводит к неожиданным результатам.

"Правильный" способ top гарантирует, что вы получите все значения для дата использует >= и < logi c:

SELECT *
FROM DAILYDATA
WHERE DATEATTEND >= @DATEATTEND
  AND DATEATTEND < DATEADD(DAY,1,@DATEATTEND);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...