mysql - 如何选择过去 30 天的数据并包含空行
问题描述
我想从数据库(表和)中获取最近 1 个月的出勤率a_days
,无论它是否为空。当数据为空时,我想在有显示数据时显示“-” ,并且可以是日期格式。(例如从到)HrEmployee
HrAttLogsFormatted
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
解决方案
您可以尝试以下查询并检查吗?
SELECT
EmployeeDetail.EmployeeId
,EmployeeDetail.Name
,TheDay.rn AS Days
,EmployeeDetail.DateIn
,EmployeeDetail.ScanIn
FROM
(SELECT TOP (DATEDIFF(DAY, '2018-01-01', DATEADD(MONTH,1,'2018-01-01')))
rn = ROW_NUMBER() OVER (ORDER BY s1.[object_id])
FROM sys.all_objects AS s1
CROSS JOIN sys.all_objects AS s2
ORDER BY s1.[object_id]
) TheDay OUTER APPLY
(SELECT
Employee.Id as EmployeeId,
Employee.Name as Name,
TheDay.rn 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
WHERE LogsFormatted.DateIn = TheDay.rn) AS EmployeeDetail
WHERE EmployeeDetail.EmployeeId = '14522228'
ORDER BY EmployeeDetail.Id, EmployeeDetail.Name, TheDay.Days, EmployeeDetail.DateIn ASC
推荐阅读
- realex-payments-api - 如何获取全球支付GP API accesstoken?
- postgresql - 如何通过 SSH 隧道使用 pgAdmin 和 Unix 域套接字连接到远程 PostgreSQL 服务器
- arm - STM32F4 RTC 闹钟中断在没有初始化的情况下被调用
- laravel - Laravel sanctum 更改 csrf cookie 路由
- javascript - JavaScript jQuery - 复选框样式设置为电源按钮并在重新加载网页时更新其状态的问题
- flutter - 如何在颤振中调用可增长的列表
- c - 由于 SO_REUSEPORT 在 Linux 下可用,是否已弃用 SO_REUSEADDR?
- c++ - 使用 boost 库 (cpp_int) 时出现常量太大的错误
- amazon-web-services - AWS AppSync - 放大代码生成类型而不创建任何内容
- azure - 在哪里可以找到 azure 身份范围及其权限级别的列表?