SELECT
Employee.emp_fname AS name,
CONVERT (VARCHAR(100), sign_time, 23) rq,
CONVERT(VARCHAR(100), max(case when seqnum = 1 then sign_time end), 24) as t1,
CONVERT(VARCHAR(100), max(case when seqnum = 2 then sign_time end), 24) as t2,
CONVERT(VARCHAR(100), max(case when seqnum = 3 then sign_time end), 24) as t3,
CONVERT(VARCHAR(100), max(case when seqnum = 4 then sign_time end), 24) as t4,
CONVERT(VARCHAR(100), max(case when seqnum = 5 then sign_time end), 24) as t5,
CONVERT(VARCHAR(100), max(case when seqnum = 6 then sign_time end), 24) as t6,
Departs.depart_name AS depart
FROM
(select TimeRecords.*,row_number() over (partition by emp_id, CONVERT (VARCHAR(100), sign_time, 23) order by sign_time) as seqnum
from TimeRecords
)TimeRecords
LEFT JOIN Employee ON Employee.emp_id = TimeRecords.emp_id
LEFT JOIN Departs ON Departs.depart_id = Employee.depart_id
LEFT JOIN fascinfo_system_department ON Departs.depart_name = fascinfo_system_department.NAME
LEFT JOIN fascinfo_system_user ON fascinfo_system_user.deptid = fascinfo_system_department.ID
WHERE
fascinfo_system_user.username = '${fr_username}'
${if(len(realname) == 0,"","and Employee.emp_fname = '" + realname + "'")}
${if(len(kaishi) == 0,"","and TimeRecords.sign_time >= '" + kaishi + " 00:00:00'")}
${if(len(jieshu) == 0,"","and TimeRecords.sign_time <= '" + jieshu + " 23:59:59'")}
GROUP BY
Employee.emp_fname,
Departs.depart_name,
CONVERT (VARCHAR(100), sign_time, 23)
为什么会出现转换失败,怎么解决呢?
你的SQL查询是从一个叫做TimeRecords的表中获取员工签到的时间,并且按照一定的条件进行筛选和分组。然后,你将这些信息与Employee和Departs表连接,以获取员工姓名和部门信息。
但是,你的查询中存在一些问题:
CONVERT
在某些地方可能不需要,因为sign_time
可能已经是VARCHAR(100)
类型。LEFT JOIN
使用了多个表,但是没有提供连接条件。这可能会导致返回的数据不符合预期。${fr_username}
、${realname}
、${kaishi}
和${jieshu}
),但是在WHERE子句中没有正确地使用它们。我假设你想要获取某个用户(通过${fr_username}
变量)在某个时间段(通过${kaish}
和${jieshu}
变量)内的签到信息,并且这个用户可能在Employee表中有一个对应的名字(通过${realname}
变量)。下面是一个修复后的查询:
SELECT
Employee.emp_fname AS name,
CONVERT (VARCHAR(100), sign_time, 23) AS rq,
MAX(CASE WHEN seqnum = 1 THEN sign_time END) AS t1,
MAX(CASE WHEN seqnum = 2 THEN sign_time END) AS t2,
MAX(CASE WHEN seqnum = 3 THEN sign_time END) AS t3,
MAX(CASE WHEN seqnum = 4 THEN sign_time END) AS t4,
MAX(CASE WHEN seqnum = 5 THEN sign_time END) AS t5,
MAX(CASE WHEN seqnum = 6 THEN sign_time END) AS t6,
Departs.depart_name AS depart
FROM TimeRecords
LEFT JOIN Employee ON Employee.emp_id = TimeRecords.emp_id
LEFT JOIN Departs ON Departs.depart_id = Employee.depart_id
LEFT JOIN fascinfo_system_department ON Departs.depart_name = fascinfo_system_department.NAME
LEFT JOIN fascinfo_system_user ON fascinfo_system_user.deptid = fascinfo_system_department.ID
WHERE fascinfo_system_user.username = '${fr_username}'
${if(len(realname) == 0,"",", Employee.emp_fname = '${realname}'")}
${if(len(kaishi) == 0,"",", TimeRecords.sign_time >= '${kaishi} 00:00:00'")}
${if(len(jieshu) == 0,"",", TimeRecords.sign_time <= '${jieshu} 23:59:59'")}
GROUP BY
Employee.emp_fname,
Departs.depart_name,
CONVERT (VARCHAR(100), sign_time, 23)
ORDER BY CONVERT (VARCHAR(100), sign_time, 23)
请注意,这个查询可能仍然不符合你的需求,因为我没有你的数据结构和具体的业务逻辑。你可能需要根据你的实际情况进行调整。