Sql server 是否使用SQL Server查询从考勤日志表和员工表中获取空值?
我有这样的查询来提取数据:Sql server 是否使用SQL Server查询从考勤日志表和员工表中获取空值?,sql-server,Sql Server,我有这样的查询来提取数据: SELECT e.EmpName, d.DepartmentName, l.EnrollNumber, v.VerifyModeName, CAST(PunchTime as DATE)Check_Date,MIN(CAST(PunchTime as Time))[TimeIN], MAX(Cast(PunchTime as Time))[TimeOUT], RIGHT('0' + CAST(DATEDIFF(
SELECT
e.EmpName,
d.DepartmentName,
l.EnrollNumber,
v.VerifyModeName,
CAST(PunchTime as DATE)Check_Date,MIN(CAST(PunchTime as Time))[TimeIN], MAX(Cast(PunchTime as Time))[TimeOUT],
RIGHT('0' + CAST(DATEDIFF(SECOND, MIN(CAST(PunchTime as Time)), MAX(Cast(PunchTime as Time))) / 3600 AS VARCHAR),2) + ':' +
RIGHT('0' + CAST((DATEDIFF(SECOND, MIN(CAST(PunchTime as Time)), MAX(Cast(PunchTime as Time))) / 60) % 60 AS VARCHAR),2) + ':' +
RIGHT('0' + CAST(DATEDIFF(SECOND, MIN(CAST(PunchTime as Time)), MAX(Cast(PunchTime as Time))) % 60 AS VARCHAR),2) as Duration
FROM
Department d,
VerifyModes v,
Employee e
FULL OUTER JOIN AttLog l
ON e.EnrollNumber=l.EnrollNumber
WHERE
e.DeptID = d.Id
AND l.VerifyMode = v.VerifyModeId
GROUP BY
e.EmpName, d.DepartmentName, l.EnrollNumber, v.VerifyModeName, CAST(PunchTime as DATE)
ORDER BY Check_Date
结果如下:
SELECT
e.EmpName,
d.DepartmentName,
l.EnrollNumber,
v.VerifyModeName,
CAST(PunchTime as DATE)Check_Date,MIN(CAST(PunchTime as Time))[TimeIN], MAX(Cast(PunchTime as Time))[TimeOUT],
RIGHT('0' + CAST(DATEDIFF(SECOND, MIN(CAST(PunchTime as Time)), MAX(Cast(PunchTime as Time))) / 3600 AS VARCHAR),2) + ':' +
RIGHT('0' + CAST((DATEDIFF(SECOND, MIN(CAST(PunchTime as Time)), MAX(Cast(PunchTime as Time))) / 60) % 60 AS VARCHAR),2) + ':' +
RIGHT('0' + CAST(DATEDIFF(SECOND, MIN(CAST(PunchTime as Time)), MAX(Cast(PunchTime as Time))) % 60 AS VARCHAR),2) as Duration
FROM
Department d,
VerifyModes v,
Employee e
FULL OUTER JOIN AttLog l
ON e.EnrollNumber=l.EnrollNumber
WHERE
e.DeptID = d.Id
AND l.VerifyMode = v.VerifyModeId
GROUP BY
e.EmpName, d.DepartmentName, l.EnrollNumber, v.VerifyModeName, CAST(PunchTime as DATE)
ORDER BY Check_Date
尽管我已经包含了完全外部连接
条件
如果我只使用:
select e.EmpName, l.PunchTime
from Employee e
full outer join AttLog l
on e.EnrollNumber = l.EnrollNumber
结果显示Employee
和NULL
PunchTime
:
那么,如何修复上述查询以获得包含NULL
PunchTime
的结果呢
然后,当我添加日期条件时,查询仍然不会再次显示NULL。如何纠正
SELECT
e.EmpName,
d.DepartmentName,
l.EnrollNumber,
v.VerifyModeName,
CAST(PunchTime as DATE)Check_Date,MIN(CAST(PunchTime as Time))[TimeIN], MAX(Cast(PunchTime as Time))[TimeOUT],
RIGHT('0' + CAST(DATEDIFF(SECOND, MIN(CAST(PunchTime as Time)), MAX(Cast(PunchTime as Time))) / 3600 AS VARCHAR),2) + ':' +
RIGHT('0' + CAST((DATEDIFF(SECOND, MIN(CAST(PunchTime as Time)), MAX(Cast(PunchTime as Time))) / 60) % 60 AS VARCHAR),2) + ':' +
RIGHT('0' + CAST(DATEDIFF(SECOND, MIN(CAST(PunchTime as Time)), MAX(Cast(PunchTime as Time))) % 60 AS VARCHAR),2) as Duration
FROM Department d
INNER JOIN Employee e
ON e.DeptID = d.Id
LEFT JOIN AttLog l
ON e.EnrollNumber = l.EnrollNumber
LEFT JOIN VerifyModes v
ON l.VerifyMode = v.VerifyModeId
WHERE cast(l.PunchTime as Date) between '2015-07-22' and '2015-07-22'
GROUP BY
e.EmpName, d.DepartmentName, l.EnrollNumber, v.VerifyModeName, CAST(PunchTime as DATE)
ORDER BY Check_Date
尝试使用
左连接
:
SELECT
e.EmpName,
d.DepartmentName,
l.EnrollNumber,
v.VerifyModeName,
CAST(PunchTime as DATE)Check_Date,MIN(CAST(PunchTime as Time))[TimeIN], MAX(Cast(PunchTime as Time))[TimeOUT],
RIGHT('0' + CAST(DATEDIFF(SECOND, MIN(CAST(PunchTime as Time)), MAX(Cast(PunchTime as Time))) / 3600 AS VARCHAR),2) + ':' +
RIGHT('0' + CAST((DATEDIFF(SECOND, MIN(CAST(PunchTime as Time)), MAX(Cast(PunchTime as Time))) / 60) % 60 AS VARCHAR),2) + ':' +
RIGHT('0' + CAST(DATEDIFF(SECOND, MIN(CAST(PunchTime as Time)), MAX(Cast(PunchTime as Time))) % 60 AS VARCHAR),2) as Duration
FROM Department d
INNER JOIN Employee e
ON e.DeptID = d.Id
LEFT JOIN AttLog l
ON e.EnrollNumber = l.EnrollNumber
LEFT JOIN VerifyModes
ON l.VerifyMode = v.VerifyModeId
GROUP BY
e.EmpName, d.DepartmentName, l.EnrollNumber, v.VerifyModeName, CAST(PunchTime as DATE)
ORDER BY Check_Date
注:
编辑: 将日期比较放在
WHERE
子句中,而不是放在JOIN
条件中:
LEFT JOIN Attlog l
ON e.DeptID = d.Id
AND cast(l.PunchTime as Date) between '2015-07-22' and '2015-07-22'
将比较放在
WHERE
子句中,将查询转换为内部联接
,从而删除NULL
行。如果我为查询添加日期条件,请提供帮助,它仍然不会显示谁的PunchTime为空。将日期放在JOIN
条件中,而不是WHERE
子句中。我将WHERE替换为“JOIN cast(l.PunchTime as DATE)介于'2015-07-22'和'2015-07-22'之间”,但得到错误:关键字'as'附近的语法不正确。没有问题,很高兴我能帮忙。把日期比较放在ON
子句中。