如何使用适合于日期时间选择器定义的时间间隔的SQL查询结果填充数据网格视图?

时间:2019-04-10 22:13:35

标签: c# datagridview

广泛地说,我想用数据库中两个不同表中的数据填充数据网格视图。这很容易实现,但是其中一个表包含一些名为StartData,StopData和Day的字段。我真正想做的是用两个日期时间选择器设置的范围中包含StartDate和StopDate(或单个日期,即“ Day”)的数据填充该数据网格视图,一个用于Start Date,一个用于停止日期。

因此,我有一个包含两个表的数据库:城市和规划。 第一个表(城市)具有IdCity(城市的ID)和Name(城市的名称)。第二个具有IdPlan(某个计划的ID),IdCity(一个城市的ID),频率(偶尔,每年,每月),StartDate(如果是偶尔的话),StopDate(如果是偶尔的话),Day(如果是当话)是每年或每月)。

好的,我们现在对数据库很满意,让我们看一下表单包含的内容。有一个DataGridView,2x DateTimePicker(一个用于开始日期,一个用于停止日期)和一个按钮将触发事件。

当单击按钮时,DataGridView将填充以下列:名称(来自城市),开始日期,停止日期,频率。如果频率是每年或每月,则StartDate将与StopDate相同。

我已经编写了用来自两个不同表的数据填充数据网格视图的代码,这里是:

void populateDataGridView()
        {
            SqlConnection con = new SqlConnection();
            con.ConnectionString = @"connectionString";
            con.Open();

            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;
            cmd.CommandText = "SELECT Cities.Name, Planning.StartDate, Planning.StopDate, Planning.Frequency, Planning.Day FROM Cities,Planning WHERE Cities.IdCity=Planning.IdCity";
            DataTable dt = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            da.Fill(dt);
            dataGridView1.DataSource = dt;
            cmd.Dispose();
            con.Close();
        }

我还编写了代码以仅选择定义的时间间隔中的日期。

void fitInInterval()
        {
            DateTime dateStart = Convert.ToDateTime(dateTimePicker1.Text);
            DateTime dateStop = Convert.ToDateTime(dateTimePicker2.Text);

            // the month
            int startdm = Convert.ToInt32(startDate.Month); // startDateMonth
            int dstartm = Convert.ToInt32(dateStart.Month);
            int stopdm = Convert.ToInt32(stopDate.Month);
            int dstopm = Convert.ToInt32(dateStop.Month);

            // the days
            int startdd = Convert.ToInt32(startDate.Day); // startDateDay
            int dstartd = Convert.ToInt32(dateStart.Day);
            int stopdd = Convert.ToInt32(stopDate.Day);
            int dstopd = Convert.ToInt32(dateStop.Day);

            if ((startdm == dstartm && startdd >= dstartd) && (stopdm == dstopm && stopdd <= dstopd))
            {
                // This one is in interval, so it will be written in data grid view
            }
         }

最后,我想找到一种方法,使之适合那些在定义的间隔内适合的特定数据。

P.S。如果频率是每年或每月,则我提到了“天”字段。在这种情况下,开始日期等于结束日期。如果在给定的月份中不存在所选的每月出勤日期,则该访问将不在该月份进行。例如:如果某个城市的每月出勤日为31,那么在只有30天的月份中将没有该城市的出游记录。

编辑:好的,我设法使用以下方法填充日期为该间隔的数据:

cmd.CommandText = "SELECT Cities.Name, Planning.StartDate, Planning.StopDate, Planning.Frequency FROM Cities,Planning WHERE Cities.IDCity=Planning.IDCity AND Planning.StartDate>='" + dateTimePicker1.Value.Date + "' AND Planning.StopDate<='" + dateTimePicker2.Value.Date + "'";

那么,现在,如果访问是每年一次还是每月一次,如何更改一天的格式?我的意思是,如果(例如)我拥有:某个城市的“计划日”(22),并且日期时间选择器的值分别为“ 19/05/2018”(开始日期)和“ 27/07/2018”(停止日期),数据网格视图将填充: -城市名称-22/05/2018-22/05/2018-每月 -城市名称-22/06/2018-22/06/2018-每月 -城市名称-22/07/2018-22/07/2018-每月

0 个答案:

没有答案