【问题标题】:Chart from SQL Datasource but DateTime in Ticks来自 SQL 数据源的图表,但日期时间为刻度
【发布时间】:2019-07-14 17:44:22
【问题描述】:

我有一个 SQL 数据库,其中存储了一些我想绘制图表的数据。问题是,我继承了这个数据库,他们将日期时间值存储为 Ticks。当我将图表数据源设置为此表时,它似乎不理解刻度。

如何让我的图表将刻度转换回我的图表可以理解的 DateTime 格式?

数据库表

我的 SQL 查询和代码:

static public DataTable get_I1(RunningTests rt)
{
    DataTable dt = new DataTable();

    using (SqlConnection cs = new SqlConnection(connString))
    {
        string query = string.Format("SELECT Time_Stamp, I1 FROM Test WHERE Unit_ID = '{0}' AND Time_Stamp >= '{1}' AND Time_Stamp <= '{2}'", rt.Unit_ID, rt.StartTime.Ticks, rt.StopTime.Ticks);
        Console.WriteLine(query);
        SqlCommand cmd = new SqlCommand(query, cs);

        using (SqlDataAdapter da = new SqlDataAdapter(cmd))
        {
            da.Fill(dt);
        }
    }

    dt.DefaultView.Sort = "Time_Stamp DESC";
    dt = dt.DefaultView.ToTable();

    return dt;
}

设置图表数据源的代码:

private void do_chart_I1(RunningTests rt)
{
    muCalGUI1.chartI1.Series.Clear();

    DataTable dt = SQL.get_I1(rt);

    muCalGUI1.chartI1.DataSource = dt;

    Series s = new Series("I1");
    s.XValueMember = "Time_Stamp";
    s.YValueMembers = "I1";
    s.ChartType = SeriesChartType.Line;
    s.BorderWidth = 2;
    s.MarkerSize = 5;
    s.MarkerStyle = MarkerStyle.Circle;

    muCalGUI1.chartI1.ChartAreas[0].AxisY.IsStartedFromZero = false;
    muCalGUI1.chartI1.ChartAreas[0].AxisX.LabelStyle.Format = "yyyy-MM-dd\nHH:mm:ss";
    muCalGUI1.chartI1.ChartAreas[0].AxisY.LabelStyle.Format = "0";
    muCalGUI1.chartI1.ChartAreas[0].RecalculateAxesScale();

    muCalGUI1.chartI1.Series.Add(s);
    muCalGUI1.chartI1.Legends.Clear();
}

结果:

期望的结果:

【问题讨论】:

  • 旁注:日期/时间通常应查询上限排他(&lt;),以避免某些边界问题。除其他外,这使得“跨步”数据集变得更容易——例如,按分钟对结果进行分组。
  • 谢谢,我继续在我的代码中进行了更改。测试可以针对同一个 ID 运行多次,所以我只想在测试期间显示测试样本。
  • 应该有一个数据库函数来进行转换,不是吗?您使用哪个数据库?
  • @TaW SQLExpress 2008

标签: c# sql mschart


【解决方案1】:

我有一个可行的解决方案。如果有人可以提供“更干净”的方法,我很乐意将其标记为答案。目前我的工作是创建一个新的数据表并将刻度转换为日期时间。

SQL 代码:

static public DataTable get_I1(RunningTests rt)
{
    DataTable dt = new DataTable();

    using (SqlConnection cs = new SqlConnection(connString))
    {
        //string query = string.Format("Select TOP {0} Serial AS [Serial #], Start, [Stop], N, ROUND(Mean,4) AS Mean, ROUND(StdDev,4) AS [Standard Deviation], ROUND(Minimum,4) AS Min, ROUND(Maximum,4) AS Max FROM TestTime JOIN Membrane ON TestTime.Membrane_ID = Membrane.Membrane_ID WHERE Serial LIKE '{1}' ORDER BY TestTime_ID", numRecords, serial);
        string query = string.Format("SELECT Time_Stamp, I1 FROM Test WHERE Unit_ID = '{0}' AND Time_Stamp >= '{1}' AND Time_Stamp <= '{2}'", rt.Unit_ID, rt.StartTime.Ticks, rt.StopTime.Ticks);
        SqlCommand cmd = new SqlCommand(query, cs);

        using (SqlDataAdapter da = new SqlDataAdapter(cmd))
        {
            da.Fill(dt);
        }
    }

    //Previous user stored the date time as ticks, have to convert back to DateTime
    DataTable dtCloned = new DataTable();
    dtCloned.Clear();
    dtCloned.Columns.Add("Time_Stamp", typeof(DateTime));
    dtCloned.Columns.Add("I1", typeof(int));

    foreach (DataRow dr in dt.Rows)
    {
        DataRow r = dtCloned.NewRow();
        r[0] = new DateTime((long)dr[0]);
        r[1] = dr[1];

        dtCloned.Rows.Add(r);
    }

    dtCloned.DefaultView.Sort = "Time_Stamp DESC";
    dtCloned = dtCloned.DefaultView.ToTable();

    return dtCloned;
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-06-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-23
  • 2016-04-02
  • 2018-11-13
  • 2013-02-01
  • 1970-01-01
相关资源
最近更新 更多