【问题标题】:Calculate Time from Database从数据库计算时间
【发布时间】: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

有没有人看到我的错误(除了还没有参数化请求)?

【问题讨论】:

  • pstartptotal 的架构类型是什么?希望它们不是字符串类型,而是某种日期或时间类型,在这种情况下,您不必转换为字符串然后解析。这也意味着您可以将计算作为 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


【解决方案1】:

我同意这里的其他人的观点,最好的情况是您的日期应该存储为日期。我将做一些假设。您的数据库超出您的控制范围或太耗时/不是出于任何原因优先处理的问题。所以我会假设你的问题是如何背心以这些格式解析你的日期和时间跨度。我还将假设您分别处理不可靠数据的空值和格式异常。

就我个人而言,我更喜欢在两个日期时间都使用解析精确方法。您可以像使用上面的格式一样使用它(用您认为合适的变量替换字符串日期)

        CultureInfo provider = CultureInfo.InvariantCulture;
        DateTime thedate = DateTime.ParseExact("2019-10-21 22:05:23", "yyyy-MM-dd HH:mm:ss",provider);
        TimeSpan timeSpan = TimeSpan.ParseExact("14:04:41", @"h\:mm\:ss", provider);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 2023-03-22
    • 2014-05-22
    • 2010-09-10
    • 1970-01-01
    相关资源
    最近更新 更多