Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何按比例正确地确定休假时间和病假时间?_C#_Mysql_.net_Datetime_Datagridview - Fatal编程技术网

C# 如何按比例正确地确定休假时间和病假时间?

C# 如何按比例正确地确定休假时间和病假时间?,c#,mysql,.net,datetime,datagridview,C#,Mysql,.net,Datetime,Datagridview,第一部分 在MySQL数据库中,我创建了休假、疾病、工人、订单、订单状态表。自动生成的MySQL代码在下面的链接中: 第二部分 在桌面应用程序中,我编写了基于算法的代码,该算法按比例计算生病时间和离开时间,模式如下图所示: 该代码的详细信息如下: private sick_leaves calculate_sickness_leaves(string NrOrder) { string query1 = string.Format("SELECT MIN(order

第一部分

在MySQL数据库中,我创建了休假、疾病、工人、订单、订单状态表。自动生成的MySQL代码在下面的链接中:

第二部分

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

该代码的详细信息如下:

   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;         
    }
第三部分

现在在这个应用程序中,我想选择测试顺序。至于在订单中显示员工的生病时间和休假时间,以及随后在datagridview上从私人病假计算病假的结果,如下链接所示:

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

从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     |
+----------------+--------------+ 
至于生病时间和休假时间的结果,我认为是不正确的。这些应该是00:00:00以外的其他值,因为我看到了ADAM GAX的离开和ANDREW WORM的疾病。那么计算应该是正确的,当然要按比例计算

我有一个问题:我如何纠正按比例正确总结休假时间和病假时间的错误?有什么想法吗?我能指望得到任何帮助或建议吗?提前谢谢

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


正如@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)
代码片段演示了这个问题

也许,你可以改成

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

你的问题太长了。试着把它简化成相关的部分。@juergend我刚刚通过简化问题进行了编辑。现在呢?int11?如果没有。。此外,INT11和INT具有相同的数字范围。11不会改变这一点。假设您对员工细分报告感到满意,那么问题似乎出在calculate_Sight_leaves函数中。我建议在调试时单步执行此函数。在你的小时数x总计算中,我会密切关注导致这些等于0的变量,并重新访问相关查询。@Prochu1991不,我没有C环境,我的评论基于帖子。老实说,这个问题本身已经很长了,没有下载更多的文件。。如果您仍然需要帮助,我建议您尝试在一个更简单的示例中重新创建问题。如果做不到这一点,一个正确的调试过程可以让你逐行调试代码,这是你的朋友!但是等等,你的意思是这样写的:小时数疾病总数=长时间的订单数。总秒数/时间的订单数。TotalSeconds@Prochu1991这将永远是0。因为在您的情况下,time_of_order.TotalSeconds小于time_of_all_orders.TotalSeconds。谢谢您的回答,但我刚刚编辑了代码,还没有帮到您。@Prochu1991您能给我们显示time_of_order.TotalSeconds的值、time_of_all_orders.TotalSeconds的值以及百分比之前的小时值吗OK,我检查了以下值:time\u of_order.TotalSeconds=00:00:00 time\u of_all\u orders.TotalSeconds=00:00:00 hours\u disease\u total=00:00:00
var percentage = time_of_order.TotalSeconds / time_of_all_orders.TotalSeconds;
hours_sickness_total = (long) (percentage * hours_sickness_total)