【发布时间】:2019-10-15 16:17:38
【问题描述】:
我试图让我的程序使用存储在 mysql 数据库中的数据计算休息时间。
private void timerpause_Tick(object sender, EventArgs e)
{
MySqlConnection conn = DBUtils.GetDBConnection();
conn.Open();
MySqlCommand dbrequest = conn.CreateCommand();
dbrequest.CommandText = "SELECT pstart FROM arbeitszeiten WHERE fullname = '" + textBoxfullname.Text + "' and active = 'JA'";
string pausebeginn = dbrequest.ExecuteScalar().ToString();
MySqlCommand dbrequest2 = conn.CreateCommand();
dbrequest2.CommandText = "SELECT ptotal FROM arbeitszeiten WHERE fullname = '" + textBoxfullname.Text + "' and active = 'JA'";
string pausenzeit = dbrequest2.ExecuteScalar().ToString();
TimeSpan pause = Convert.ToDateTime(pausenzeit).TimeOfDay;
DateTime start = Convert.ToDateTime(pausebeginn);
TimeSpan zwischen = (DateTime.Now - Convert.ToDateTime(start)).Add(pause);
label1.Text = zwischen.ToString();
conn.Close();
}
当代码执行时它告诉我:
TimeSpan pause = Convert.ToDateTime(pausenzeit).TimeOfDay;
章程未被检测为有效的DateTime 值(Die Zeichenfolge wurde nicht als gültiges DateTime erkannt)
格式:
DB pstart = yyyy-MM-dd HH:mm:ss
DB ptotal = HH:mm:ss
有没有人看到我的错误(除了还没有参数化请求)?
【问题讨论】:
-
pstart和ptotal的架构类型是什么?希望它们不是字符串类型,而是某种日期或时间类型,在这种情况下,您不必转换为字符串然后解析。这也意味着您可以将计算作为 sql 语句而不是在具有 2 个往返语句的代码中进行。 -
如果我理解正确,您是在询问 db 中的数据类型以及它来自哪里? pstart 的时间戳和 ptotal 的时间。 pstart 在按下按钮时自动传递,ptotal 在它自己的数据库中计算
-
所以你可以使用date function 来计算
zwischen作为查询然后直接返回。您也不应该在这些结果上调用ToString,因为它们可能已转换为您键入 DateTime、DateTimeOffset 或 TimeSpan。我不使用 MySql,因此您必须测试以确定默认情况下每种 MySql 类型使用这些本机类型中的哪一种。 -
我怀疑快速修复是因为时间不是日期,因此您可以通过先附加基本日期将其转换为日期,例如Convert.ToDateTime("2000-01-01 " + pausenzeit).TimeOfDay
-
至少在
pstart的情况下,如果数据库存储了一个日期,则您不需要转换ToString然后Convert.ToDateTime的体操,只需将其读取为日期时间。 “格式”通知虽然表明它可能存储为字符串
标签: c# mysql sql time calculation