按小时计算加班费

时间:2012-06-25 11:41:13

标签: c# sql-server

我有两张桌子。一个名为* tbl_workers *,其他名称为* tbl_attendance *。 在* tbl_worker *中,我记录了工人的工资。 在* tbl_attendance *中,我记录了他在特定日期所做的加班时间。 现在,我想要的是首先为工人生成每小时工资。 将工资除以31,然后将结果除以9,因为9小时是办公室的正常工作日。 通过这样做,我掌握了工人的每小时费率。 现在,我想要的是将* tbl_attendence *的每一行(OT是列的名称)乘以工人的每小时费率,并将其存储在名为* overtime_rate *的另一列中。到目前为止我所做的是:

SqlConnection con = new SqlConnection(@"Data Source=TIMBERTRENDZ-PC\NEWSERVER;Initial Catalog=trendz;user id=sa;Password=Letmein3#;Trusted_connection=False");
        con.Open();
        SqlCommand cmd = new SqlCommand("Select worker_salary from tbl_workers where worker_id='"+textBox1.Text +"'",con);
        int salary = (int)cmd.ExecuteScalar();
        salary = salary/31;
        salary = salary / 9;
        label1.Text = Convert.ToString(salary);
        SqlCommand cmd1 = new SqlCommand("Select ot from tbl_attendence where worker_id='"+textBox1.Text + "'",con);
        int ot = (int)cmd1.ExecuteScalar();
        ot = ot / 60;
        salary = salary * ot;
        SqlCommand cmd2 = new SqlCommand("update tbl_attendence set overtime_rate='"+salary +"' where worker_id='"+textBox1+ "'",con);
        /**int i = cmd2.ExecuteNonQuery();
        label2.Text = Convert.ToString(i);
        **/

但这是在与工作人员ID匹配的所有列中存储相同数量。

1 个答案:

答案 0 :(得分:1)

好的我需要一个解释,首先为什么你在使用ADO.Net时这样做可以在数据库中作为单个更新完成,其次有一个原因你需要保存在数据库中的值,因为这打开了你自己当员工薪资发生变化时,数据变得不同步,您需要确保加班值也会更新。

Select ((worker_salary / 31) / 9) * (ot / 60) 
from tbl_attendence as a 
inner join tbl_workers as w on w.worker_id = a.worker_id
where worker_id=

此查询将根据您上面的计算得出您的OT费率。然后,要更新tbl_attendance表中的overtime_rate字段,您可以运行

update tbl_attendence set overtime_rate= 
Select ((worker_salary / 31) / 9) * (ot / 60) )  
from tbl_attendence as a 
inner join tbl_workers as w on w.worker_id = a.worker_id

这将为您更新所有工人的加班费率。不需要使用C#,ADO,它只是让SQL Server完成它的工作。在运行它之前验证SQL,因为我自由键入它而没有检查括号等。

希望这有帮助。

杰森

编辑:

为了帮助您了解此查询的工作原理,我确保在列名称中包含表名。只要两个表中都不存在列,查询就会起作用。

update tbl_attendence set overtime_rate= 
Select ((w.worker_salary / 31) / 9) * (a.ot / 60) )  
from tbl_attendence as a 
inner join tbl_workers as w on w.worker_id = a.worker_id