mysql - 如何选择过去 30 天的数据并包含空行

标签 mysql sql

我想从数据库(表a_daysHrEmployeeHrAttLogsFormatted)获取最近1个月的出勤情况,无论数据库是否为空。当数据为空时,我想在有来自 LogsFormatted.DateIn 的显示数据时显示“-”,并且可以在 WHERE BETWEEN(Y-m-d) 中 日期格式。 (示例从 2018-06-012018-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/

相关文章:

sql - 使用 PL/SQL 表避免使用 SELECT 进行全表扫描

MySQL 大数点精度(例如 IPv6)

mysql - group_concat 非常慢

php - mysqli prepare and insert statements using variables插入值和变量语法错误

mysql - SQL查询选择语句

sql - 在sql server中将年月日转换为日期

MySQL:优化查询以从字符串集中查找匹配的字符串

sql - 选择所有出生日期在月底的员工

mysql - 自连接表以获取 2 列的所有组合的值

sql - 将数组转换为 Postgres 中的行