繁体   English   中英

有没有更简单的方法来进行这个查询?

[英]Is there an easier way to make this query?

我从名为“empleados”和“fichajes”的数据库中有两个不同的表。 empleados 有员工数据,fichajes 有他们开始工作的日期和时间。

我想获得特定员工在两个日期之间完成的总工作时间,比如说从 20 日到 29 日。

我有一个在 C# 上与 Dapper 一起使用的查询:

SELECT CONCAT(e.nombre, " " ,e.apellido) as fullName, tfichajes.total 
FROM empleados e 
    INNER JOIN (
                SELECT f1.nif, 
                    SEC_TO_TIME(SUM(TIME_TO_SEC(f1.fechasalida) - TIME_TO_SEC(f1.fechaentrada))) AS total 
                    FROM fichajes f1 
                    WHERE f1.fechasalida <= '2019-04-29' 
                    and f1.fechaentrada >= '2019-04-20' 
                    GROUP BY f1.nif
                ) AS tfichajes 
        ON e.nif = tfichajes.nif 
WHERE e.nif = '33333333P'

这工作得很好,但我想知道是否可以让它更简单。

这是我的程序中的代码:

public static List<string> CalculaTotalHoras(string nif, DateTime fechaEntrada, DateTime fechaSalida)
{
    var dbCon = DBConnection.Instancia();
    if (dbCon.Conectado())
    {
        string format = "yyyy-MM-dd";
        List<string> result = new List<string>();
        using (IDbConnection conexion = dbCon.Conexion)
        {
            var output = conexion.Query($"SELECT CONCAT(e.nombre, \" \" ,e.apellido) as fullName, tfichajes.total " +
                $"FROM empleados e INNER JOIN (SELECT f1.nif, SEC_TO_TIME(SUM(TIME_TO_SEC(f1.fechasalida) - TIME_TO_SEC(f1.fechaentrada))) AS total " +
                $"FROM fichajes f1 where f1.fechasalida <= '{fechaSalida.ToString(format)}' and f1.fechaentrada >= '{fechaEntrada.ToString(format)}' GROUP BY f1.nif) " +
                $"as tfichajes ON e.nif = tfichajes.nif where e.nif = '{ nif }';").ToList();

            var i = 0;
            foreach (IDictionary<string, object> row in output)
            {
                foreach (var pair in row)
                {
                    if (i == 0)
                    {
                        result.Add(pair.Value.ToString());
                        i++;
                    }
                    else
                    {
                        result.Add(pair.Value.ToString());
                    }
                }
            }
            return result;
        }
    }
    else return null;
}

如果您对此处代码的可读性有疑问,那么您就有了一个 gyazo。 工作时间fichajes表和员工empleados表。

使用该确切查询,预期结果是Alvaro Arguelles 00:05:00 ,并且在代码中,我希望在result列表中将Alvaro Arguelles00:05:00分开。

我做的比实际困难得多吗?

您的查询可以显着简化。 您的内部查询正在选择在相关日期工作的所有员工,我将从 INNER 查询作为主 FROM 表开始,获取一名员工的数据。 然后加入员工以获取名称。

select
      CONCAT(e.nombre, " " ,e.apellido) as fullName,
      OneEmp.Total
   from
      ( select
              f1.nif,
              SEC_TO_TIME( SUM(TIME_TO_SEC(f1.fechasalida) 
                             - TIME_TO_SEC(f1.fechaentrada))) AS total 
           from
              fichajes f1
           where
                  f1.nif = '33333333P'
              AND f1.fechasalida >= '2019-04-20' 
              AND f1.fechasalida <= '2019-04-29' ) OneEmp
         JOIN empleados e
            on OneEmp.nif = e.nif

由于您的查询是针对每个员工进行汇总的,因此无论如何它只会返回一行。 所以上面的查询将返回 1 行,2 列......名称和总数。 应该能够直接读回这两个值。

但正如其他人评论的那样,参数化您的查询调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM