Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 是否使用SQL Server查询从考勤日志表和员工表中获取空值?_Sql Server - Fatal编程技术网

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
子句中。