我想从数据库(表a_days
、HrEmployee
和HrAttLogsFormatted
)获取最近1个月的出勤情况,无论数据库是否为空。当数据为空时,我想在有来自 LogsFormatted.DateIn
的显示数据时显示“-”,并且可以在 WHERE BETWEEN
和 (Y-m-d) 中
日期格式。 (示例从 2018-06-01
到 2018-06-10
)
查询:
SELECT
Employee.Id as "EmployeeId",
Employee.Name as "Name",
TheDay.Days as "Date",
LogsFormatted.DateIn as "DateIn",
LogsFormatted.ScanIn as "ScanIn"
FROM
HrEmployee as Employee
LEFT JOIN HrEmployeeShift as EmployeeShift ON Employee.ShiftId = EmployeeShift.Id
LEFT JOIN HrAttMachine as Machine ON Employee.MachineIP = Machine.IP
LEFT JOIN HrAttLogsFormatted as LogsFormatted ON LogsFormatted.FingerId = Employee.Id
LEFT JOIN a_days as TheDay ON TheDay.Days = DATE_FORMAT(LogsFormatted.DateIn, "%d")
WHERE Employee.ShiftId = EmployeeShift.Id
AND Employee.Id = '14522228'
ORDER BY Employee.Id, Employee.Name, TheDay.Days, LogsFormatted.DateIn ASC
结果:
FingerId Name Date DateIn ScanIn
14522228 Aldan Rizki Santosa 3 2018-07-06 06:45:54
14522228 Aldan Rizki Santosa 4 2018-07-09 06:38:12
14522228 Aldan Rizki Santosa 5 2018-07-10 06:48:35
我想要什么:
FingerId Name Date DateIn ScanIn
14522228 Aldan Rizki Santosa 1 - -
14522228 Aldan Rizki Santosa 2 - -
14522228 Aldan Rizki Santosa 3 2018-07-06 06:45:54
14522228 Aldan Rizki Santosa 4 2018-07-09 06:38:12
14522228 Aldan Rizki Santosa 5 2018-07-10 06:48:35
14522228 Aldan Rizki Santosa 6 - -
.....
.....
..... Until the date at the end of the month
最佳答案
您可以尝试以下查询并检查吗?
<前>选择
员工详细信息.员工 ID
,员工详细信息.姓名
,TheDay.rn AS Days
,员工详细信息.日期
,EmployeeDetail.ScanIn
从
(SELECT TOP (DATEDIFF(DAY, '2018-01-01', DATEADD(MONTH,1,'2018-01-01')))
rn = ROW_NUMBER() OVER (ORDER BY s1.[object_id])
来自 sys.all_objects AS s1
交叉连接 sys.all_objects AS s2
按 s1.[object_id] 排序
) 当天外层申请
(选择
Employee.Id 作为 EmployeeId,
Employee.Name 作为姓名,
TheDay.rn 作为日期,
LogsFormatted.DateIn 为“DateIn”,
LogsFormatted.ScanIn 为“ScanIn”
来自 HrEmployee 作为员工
LEFT JOIN HrEmployeeShift as EmployeeShift ON Employee.ShiftId = EmployeeShift.Id
左连接 HrAttMachine 作为机器 ON Employee.MachineIP = Machine.IP
LEFT JOIN HrAttLogsFormatted as LogsFormatted ON LogsFormatted.FingerId = Employee.Id
WHERE LogsFormatted.DateIn = TheDay.rn) AS EmployeeDetail
哪里 EmployeeDetail.EmployeeId = '14522228'
按 EmployeeDetail.Id、EmployeeDetail.Name、TheDay.Days、EmployeeDetail.DateIn ASC 排序
关于mysql - 如何选择过去 30 天的数据并包含空行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51356247/