Mysql SQL,基于变量的日期X和X之间的总和

Mysql SQL,基于变量的日期X和X之间的总和,mysql,sql,database,Mysql,Sql,Database,所以我有点纠结于这个问题,我在一所以小时为基础的学校里做入门级的工作 我需要找到所有通过注册结束日期的学生,并获得从第一次出勤日期到注册结束日期的学生学时总数。这是我编写的代码的开始,但我知道我的案例是错误的 例如,学生A的出勤日期大于其合同终止日期 在合同结束日期,他的总小时数=560 完成该计划的最低时间为600小时 然后,我们在截止日期前他尚未完成的40个小时的基础上再加上一笔附加费 我可以做数学,我只需要在我能让学生们亲身体验的地方做。如果我添加诸如Where ATD.Attendanc

所以我有点纠结于这个问题,我在一所以小时为基础的学校里做入门级的工作

我需要找到所有通过注册结束日期的学生,并获得从第一次出勤日期到注册结束日期的学生学时总数。这是我编写的代码的开始,但我知道我的案例是错误的

例如,学生A的出勤日期大于其合同终止日期

在合同结束日期,他的总小时数=560

完成该计划的最低时间为600小时

然后,我们在截止日期前他尚未完成的40个小时的基础上再加上一笔附加费

我可以做数学,我只需要在我能让学生们亲身体验的地方做。如果我添加诸如Where ATD.Attendancedate>=Reg.enddate之类的内容,它当然只会比结束日期晚几个小时

  SELECT CONCAT('<a href="admin_view_student.jsp?studentid=', 
     CAST(SDT.studentId AS CHAR), '">', CAST(SDT.firstName AS bCHAR), ' ', 
    CAST(SDT.lastName AS CHAR), '</a>') AS Name,
    PGM.programmeName AS 'Program',
     FORMAT(SUM(ATD.duration),2) AS 'Total Hours',
    PGM.MinClockHours AS 'Program Total',
     ATD.attendancedate AS 'ATTDATE',
REG.Enddate AS 'EndDate',
Case WHEN MAX(ATD.attendancedate) >= REG.Enddate Then  Sum(ATD.duration) Between MIN(ATD.attendancedate) AND REG.enddate
ELSE NULL END AS 'Whatever' 
FROM Attendance ATD
INNER JOIN Registrations    REG ON ATD.studentId = 
      REG.studentId AND  REG.isActive = 1
INNER JOIN Programmes       PGM ON REG.programmeId 
    = PGM.programmeId AND  PGM.isActive = 1
INNER JOIN Students         SDT ON REG.studentId = 
     SDT.studentId AND SDT.isactive = 1
  WHERE
    REG.ADMINID                         AND
    REG.enrollmentSemesterId = 4000441  AND
     PGM.programmename Not like ('Careers Pathway') AND PGM.programmename Not like ('Instructor Training') AND
    ATD.subjectId IN (SELECT GSR.subjectId
            FROM CourseGroups CGP
            INNER JOIN GroupSubjectReltn GSR ON CGP.courseGroupId=GSR.courseGroupId AND GSR.isActive=1
            WHERE REG.programmeId = CGP.programmeId and CGP.isActive=1)
                                        AND
    ATD.classId IN (SELECT DISTINCT CRS.classId
            From ClassStudentReltn CRS
            Where CRS.studentId = ATD.studentId AND CRS.isActive=1)
GROUP BY SDT.lastname
ORDER BY SDT.firstName

您可以通过自联接非常直接地解决这个问题。您需要根据ATD.Attendancedate>=Reg.enddate的位置选择有问题的学生,然后仅对满足该条件的学生进行计算。因此:

[your query]
inner join 
    (SELECT studentId
    FROM Attendance ATD
    inner join Registrations REG
    ON ATD.studentId = REG.studentId 
        AND  REG.isActive = 1
    WHERE ATD.Attendancedate >= Reg.enddate) as late
on [your query].studentId = late.studentId

您可以通过自联接非常直接地解决这个问题。您需要根据ATD.Attendancedate>=Reg.enddate的位置选择有问题的学生,然后仅对满足该条件的学生进行计算。因此:

[your query]
inner join 
    (SELECT studentId
    FROM Attendance ATD
    inner join Registrations REG
    ON ATD.studentId = REG.studentId 
        AND  REG.isActive = 1
    WHERE ATD.Attendancedate >= Reg.enddate) as late
on [your query].studentId = late.studentId
不确定包含SUM的case表达式是否正常,它的工作方式是相反的。e、 g.SUMCase当MAXATD.attendancedate>=REG.Enddate且在minad.attendancedate和REG.Enddate之间的ATD.attendancedate时,则ATD.duration End不确定包含SUM的大小写表达式是否正常,其工作方式相反。e、 g.当最大出席人数>=REG.Enddate,且在MINATD.ATENDANCEDATE和REG.Enddate之间的ATD.ATENDANCE,则为ATD.duration end