帆软:从字符串转换日期或时间时转换失败

img


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表连接,以获取员工姓名和部门信息。

但是,你的查询中存在一些问题:

  1. 你的转换函数CONVERT在某些地方可能不需要,因为sign_time可能已经是VARCHAR(100)类型。
  2. 你的LEFT JOIN使用了多个表,但是没有提供连接条件。这可能会导致返回的数据不符合预期。
  3. 你的查询中使用了变量(如${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)

请注意,这个查询可能仍然不符合你的需求,因为我没有你的数据结构和具体的业务逻辑。你可能需要根据你的实际情况进行调整。