【问题标题】:How to fix sumarizing leave time and sickness time proportionally and correctly?如何按比例正确地确定总结休假时间和病假时间?
【发布时间】:2019-11-12 22:46:41
【问题描述】:

第 1 部分

在 MySQL 数据库中,我创建了“leave”、“Sickness”、“Workers”、“Orders”、“Order_status”表。自动生成的 MySQL 代码如下链接:

https://pastebin.com/f92RH4id

第 2 部分

在桌面应用程序中,我编写了基于算法的代码,该算法按比例计算病假时间,模式如下图所示:

该代码的详细信息在这里:

   private sick_leaves calculate_sickness_leaves(string NrOrder)
    {
        string query1 = string.Format("SELECT MIN(order_status.BEGIN_DATE), MAX(order_status.END_DATE) " +
        "FROM project1.order_status INNER JOIN project1.orders ON orders.ID_ORDER = order_status.ID_ORDER " +
        "WHERE orders.ORDER_NUMBER = '" + NrOrder + "';");

        SQLdata.connection.Open();
        using (var command = new MySqlCommand(query1, SQLdata.connection))
        {
            using (var reader1 = command.ExecuteReader())
            {
                while (reader1.Read())
                {
                    date_min = Convert.ToDateTime(reader1[0]);
                    date_max = Convert.ToDateTime(reader1[1]);
                }
            }
        }

        TimeSpan time_of_sickness_to_order = new TimeSpan(0, 0, 0);
        TimeSpan time_of_leave_to_order = new TimeSpan(0, 0, 0);

        for (DateTime date = date_min; date <= date_max; date = date.AddDays(1))
        {
            long hours_sickness_total = 0;
            long hours_leave_total = 0;
            TimeSpan time_of_all_orders;
            TimeSpan time_of_order;

            string query2 = $"SELECT COUNT(sickness.ID_WORKER) AS 'AMOUNT OF WORKERS ON SICKNESS' " +
            $"FROM project1.sickness WHERE DATE(sickness.BEGIN_DATE) <= '{date}' AND DATE(sickness.END_DATE) >= '{date}';";
            hours_sickness_total = SQLdata.load_amount_sql(query2) * 8;

            string query3 = $"SELECT COUNT(leaves.ID_WORKER) AS 'AMOUNT OF WORKERS ON LEAVE' FROM project1.leaves" +
            $" WHERE DATE(leaves.BEGIN_DATE) <= '{date}' AND DATE(leaves.END_DATE) >= '{date}';";
            hours_leave_total = SQLdata.load_amount_sql(query3) * 8;

            string query4 = $"SELECT IFNULL(TIME_FORMAT(SEC_TO_TIME(SUM(TIME_TO_SEC(order_status.END_DATE) - TIME_TO_SEC(order_status.BEGIN_DATE))), '%H:%i:%s'), '00:00:00') AS 'REALIZATION TIME OF ALL ORDERS IN DAY' " +
            $"FROM project1.order_status INNER JOIN project1.orders ON orders.ID_ORDER = order_status.ID_ORDER " +
            $"WHERE (DATE(order_status.BEGIN_DATE) = '{date}' AND DATE(order_status.END_DATE) = '{date}');";

            time_of_all_orders = SQLdata.load_time_sql(query4);

            string query5 = $"SELECT IFNULL(TIME_FORMAT(SEC_TO_TIME(SUM(TIME_TO_SEC(order_status.END_DATE) - TIME_TO_SEC(order_status.BEGIN_DATE))), '%H:%i:%s'), '00:00:00') AS 'REALIZATION TIME OF ORDER IN DAY' " +
            $"FROM project1.order_status INNER JOIN project1.orders ON orders.ID_ORDER = order_status.ID_ORDER " +
            $"WHERE (DATE(order_status.BEGIN_DATE) = '{date}' AND DATE(order_status.END_DATE) = '{ date}') " +
            $"AND orders.ORDER_NUMBER = '{NrOrder}';";

            time_of_order = SQLdata.load_time_sql(query5);

            hours_sickness_total = ((long)(time_of_order.TotalSeconds / time_of_all_orders.TotalSeconds) * hours_sickness_total);
            time_of_sickness_to_order += new TimeSpan(hours_sickness_total * 10000000 * 60 * 60);

            hours_leave_total = ((long)(time_of_order.TotalSeconds / time_of_all_orders.TotalSeconds) * hours_leave_total);
            time_of_leave_to_order += new TimeSpan(hours_leave_total * 10000000 * 60 * 60);

        }

        SQLdata.connection.Close();
        sick_leaves x = new sick_leaves();
        x.sickness_time = time_of_sickness_to_order;
        x.leave_time = time_of_leave_to_order;
        return x;         
    }

我不得不编写额外的代码来加载以下数据:

1) 用户可以选择的订单时间(每天)load_time_sql 以及所选订单期间所有订单的时间(每天)。

2) 所选订单中每天的病假总次数。

public static TimeSpan load_time_sql(string query)
{
    TimeSpan x = new TimeSpan(0, 0, 0);
    using (var command = new MySqlCommand(query, SQLdata.connection))
    {
        using (var reader1 = command.ExecuteReader())
        {
            while (reader1.Read())
            {
                x = Convert.ToDateTime(reader1[0]).TimeOfDay;
            }
            return x;
        }
    }
}

public static int load_amount_sql(string query)
{
    int x = 0;
    using (var command = new MySqlCommand(query, SQLdata.connection))
    {
        using (var reader1 = command.ExecuteReader())
        {
            while (reader1.Read())
            {
                x = Convert.ToInt32(reader1[0]);
            }
            return x;
        }
    }
}

第 3 部分

现在在这个应用程序中,我想选择“TEST”订单。至于按顺序显示工人的病假和休假时间,然后在“私人病假计算病假”的数据网格视图上生成结果,在下面的链接中是这样写的:

https://pastebin.com/WUGjTLuv

生成此订单的报告后,我得到以下结果:

来自 MySqlDataAdapter 适配器4:

+---------+---------+---------------+---------------+------------+------------+
|  FNAME  | LNAME   |  BEGIN_DATE        | END_DATE              | LEAVE_TIME | 
+---------+---------+---------------+---+-----------+------------+------------+
|  ADAM   |  GAX    | 2019-03-19 7:00:00 | 2019-03-19 15:00:00   | 08:00:00   |        
+---------+---------+---------------+---------------+------------+------------+
|  ANDREW |  WORM   | EMPTY              | EMPTY                 | 00:00:00   |
+---------+---------+---------------+---------------+------------+------------+

来自 MySqlDataAdapter 适配器5:

+---------+---------+---------------+---------------+------------+---------------+
|  FNAME  | LNAME   |  BEGIN_DATE        | END_DATE              | SICKNESS_TIME | 
+---------+---------+---------------+---+-----------+------------+---------------+
|  ADAM   |  GAX    | EMPTY              | EMPTY                 | 00:00:00      |        
+---------+---------+---------------+---------------+------------+---------------+
|  ANDREW |  WORM   | 2019-03-19 7:00:00 | 2019-03-20 15:00:00   | 16:00:00      |
+---------+---------+---------------+---------------+------------+---------------+

来自私人病假计算病假:

+----------------+--------------+
| sickness_time  | leave_time   |   
+----------------+--------------+
|  00:00:00      | 00:00:00     |
+----------------+--------------+ 

至于sickness_time 和leave_time 的结果,我认为是不正确的。这些应该是“00:00:00”以外的其他值,因为我看到了 ADAM GAX 的休假和 ANDREW WORM 的病假。那么计算应该是正确的,当然是按比例计算的。

我有一个问题:如何按比例正确地总结休假时间和病假时间的错误?有任何想法吗?我可以指望任何帮助或建议吗?提前致谢。

我的代码在链接中以下载该或其他内容:

https://www.mediafire.com/folder/pue5ainu4w4a6ii,r9frx0713s2iy51/shared

【问题讨论】:

  • 你的问题太长了。尽量减少到相关部分。
  • @juergend 我刚刚通过减少问题进行了编辑。现在呢?
  • int(11) ? (11) 没有 zerofill 什么都不做。而且 INT(11)INT 具有相同的数字范围 (11) 不会改变这一点。
  • 假设您对工人故障报告感到满意,看起来问题出在您的 calculate_sickness_leaves 函数上。我建议在调试时单步执行此功能。在您的hours_x_total calculations 中,我会密切注意会导致这些变量等于 0 的变量并重新访问相关查询..
  • @Prochu1991 不,我没有 C# 环境,我的评论是基于帖子的。老实说,这个问题本身已经很长,没有下载更多文件。如果您仍然需要帮助,我建议您尝试在一个更简单的示例中重新创建问题。如果做不到这一点,让您逐行逐行执行代码的正确调试过程是您的朋友!

标签: c# mysql .net datetime datagridview


【解决方案1】:

正如@Arth 所指出的,问题是

hours_sickness_total = ((long)(time_of_order.TotalSeconds / time_of_all_orders.TotalSeconds) * hours_sickness_total);

,更准确地说,

(long)(time_of_order.TotalSeconds / time_of_all_orders.TotalSeconds)

代码 sn -p Cast double to long 演示了问题。

或许,你可以换成

var percentage = time_of_order.TotalSeconds / time_of_all_orders.TotalSeconds;
hours_sickness_total = (long) (percentage * hours_sickness_total)

【讨论】:

  • 但是你的意思是这样写吗:hours_sickness_total = (long)(time_of_order.TotalSeconds / time_of_all_orders.TotalSeconds)
  • @Prochu1991 将始终为 0。因为在您的情况下,time_of_order.TotalSeconds 小于 time_of_all_orders.TotalSeconds
  • 谢谢你的回答,但我刚刚编辑了我的代码,还没有帮助。
  • @Prochu1991 你能告诉我们time_of_order.TotalSeconds的值,time_of_all_orders.TotalSeconds的值和hours_sickness_totalpercentage之前的值
  • 好的,我检查了以下值:time_of_order.TotalSeconds = 00:00:00 time_of_all_orders.TotalSeconds = 00:00:00 hours_sickness_total = 00:00:00 尽管在 percentage 之后
猜你喜欢
  • 2019-08-21
  • 1970-01-01
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-14
相关资源
最近更新 更多