Как я могу искать все заказы в рабочее время за один день с 8:00 до 22:00 c# datetimepickers? - PullRequest
1 голос
/ 12 января 2020

Я хочу найти все заказы за один день в рабочее время с 08:00 до 22:00, я использовал 2 средства выбора времени и выбрал дату сегодня, но при поиске не отображаются все заказы за сегодня, я попробовал следующее код при нажатии кнопки поиска:

private void BtnSearch_Click(object sender, EventArgs e)
{    

                string sql = @" SELECT [Order_Payments].[order_id] as 'Acc No.'
      ,order_vat as 'VAT value'
      ,vat_orders.[total_amount] as 'Total After VAT'
      ,[Order_Payments].paid_amount as 'Total Paid'
      ,[remaining_amount]
      ,vat_orders.order_date AS 'Order Date'
      ,Customers.CustName as 'Clinic'

  FROM [Order_Payments]
  inner join vat_orders on  [Order_Payments].order_id = vat_orders.ORDER_ID
  inner join Customers on  [Order_Payments].custid = Customers.CustId
  WHERE 1=1 ";

                string condition = "";
                string orderby = "";
                orderby += " ORDER BY Order_Payments.order_id";

                DateTime fromDate;
                DateTime toDate;


                if (!DateTime.TryParse(dtFromDate.Value.ToString(), out fromDate))
                {
                    System.Windows.Forms.MessageBox.Show("Invalid From Date");
                }
                else if (!DateTime.TryParse(dtToDate.Value.ToString(), out toDate))
                {
                    System.Windows.Forms.MessageBox.Show("Invalid to Date");
                }
                else
                {
                    condition += " and vat_orders.order_date between '" + fromDate + "' and '" + toDate + "'";
                }


                if (textCustId.Text != "")
                {
                    condition += " and Order_Payments.CUSTID ='" + textCustId.Text + "'";
                }


                DataTable dt = data.fireDatatable(string.Format(sql + condition + orderby));
                OrdersDataGridView.DataSource = dt;
                OrdersDataGridView.Refresh();


        }

Как я могу обновить свой код и выполнить поиск по сегодняшним заказам с 1/12/2020 с 08:00 до 1/12/2020 до 22:00 вечера?

Или я могу сделать это с помощью оператора select, чтобы выбрать дату на сегодня, а затем выбрать время с 00:00 до 22:00 с сервера SQL?

Ответы [ 2 ]

1 голос
/ 13 января 2020

Вы можете решить свою проблему, используя функцию CAST, и вы можете вызывать только дату или время только в предложении where в вашем операторе выбора: эта ссылка объясняет функцию приведения https://www.w3schools.com/sql/func_sqlserver_cast.asp

    private void BtnSearch_Click(object sender, EventArgs e)
            {
                string sql = @" SELECT [Order_Payments].[order_id] as 'Acc No.'
          ,order_vat as 'VAT value'
          ,vat_orders.[total_amount] as 'Total After VAT'
          ,[Order_Payments].paid_amount as 'Total Paid'
          ,[remaining_amount]
          ,vat_orders.order_date 
          ,Customers.CustName as 'Clinic'

      FROM [Order_Payments]
      inner join vat_orders on  [Order_Payments].order_id = vat_orders.ORDER_ID
      inner join Customers on  [Order_Payments].custid = Customers.CustId
      WHERE cast(vat_orders.order_date as time) between '01:00:00' and '23:50:50' ";

                    string condition = "";
                    string orderby = "";
                    orderby += " ORDER BY Order_Payments.order_id";

                    DateTime fromDate;
                    DateTime toDate;


                    if (!DateTime.TryParse(dtFromDate.Value.ToString(), out fromDate))
                    {
                        System.Windows.Forms.MessageBox.Show("Invalid From Date");
                    }
                    else if (!DateTime.TryParse(dtToDate.Value.ToString(), out toDate))
                    {
                        System.Windows.Forms.MessageBox.Show("Invalid to Date");
                    }
                    else
                    {
                        condition += " and cast(vat_orders.order_date as date) between '" + fromDate + "' and '" + toDate + "'";
                    }


if (textCustId.Text != "")
            {
                condition += " and Order_Payments.CUSTID ='" + textCustId.Text + "'";
            }


            DataTable dt = data.fireDatatable(string.Format(sql + condition + orderby));
            OrdersDataGridView.DataSource = dt;
            OrdersDataGridView.Refresh();
    }
0 голосов
/ 13 января 2020

Вам необходимо преобразовать объект DateTime в строковое представление, которое может использовать SQL, предпочтительно

condition += " and vat_orders.order_date between '" + fromDate.ToString("o") + "' and '" + toDate.ToString("o") + "'";

Вы можете обратиться к документации здесь

и вы можете обратиться к этому другому вопросу , чтобы узнать, почему используется «o» (формат ISO 8601)

...