mysql - 我如何根据有限的日历为每个员工创建缺失的日期记录?

标签 mysql sql tsql

我有两个表,一个是缩写日历:

create table dbo.calendar
(
    [date] datetime
)

insert into dbo.calendar values ('20150101 00:00:00 AM') -- 1/1/15
insert into dbo.calendar values ('20150102 00:00:00 AM') -- 1/2/15
insert into dbo.calendar values ('20150103 00:00:00 AM') -- 1/3/15
insert into dbo.calendar values ('20150104 00:00:00 AM') -- 1/4/15

另一个是时钟

create table dbo.timeclock
(
    id integer,
    punchtime datetime,
    punchtype varchar(25)
)

--employee 1
insert into dbo.timeclock values (1,'20150102 08:00:00 AM','in') -- 8am  1/2/15
insert into dbo.timeclock values (1,'20150102 05:00:00 PM','out') -- 5pm  1/2/15
insert into dbo.timeclock values (1,'20150103 08:00:00 AM','in') -- 8am  1/3/15
insert into dbo.timeclock values (1,'20150103 05:00:00 PM','out') -- 5pm  1/3/15

--employee 2
insert into dbo.timeclock values (2,'20150103 08:00:00 AM','in') -- 8am  1/3/15
insert into dbo.timeclock values (2,'20150103 05:00:00 PM','out') -- 5pm  1/3/15

我想要的是在 dbo.timeclock 中为每位员工在日历中的每个日期都没有记录的每一天创建一个“未输入时间”记录。茶几看起来像这样:

id      punchtime               type
--------------------------------------------
1       20150101 00:00:00 AM    no time entered
1       20150102 08:00:00 AM    in
1       20150102 05:00:00 PM    out
1       20150103 08:00:00 AM    in
1       20150103 05:00:00 PM    out
1       20150104 00:00:00 AM    no time entered
2       20150101 00:00:00 AM    no time entered
2       20150102 00:00:00 AM    no time entered
2       20150103 08:00:00 AM    in
2       20150103 05:00:00 PM    out
2       20150104 00:00:00 AM    no time entered

我能够使用游标来做到这一点,但它运行得太慢而且我知道这不是“正确”的做法。

感谢您的关注!

最佳答案

我会创建一个自动填充您的 dbo.timeclock 的触发器插入 dbo.calendar 时的表格使用默认值 no time entered .然后当你更新你的 dbo.timeclock表在向表中添加新值后使用另一个触发器删除此值。

这将在您向表中输入新值时自动处理您所描述的内容,而无需再次考虑。

插入 dbo.calendar 的触发器

CREATE TRIGGER timecard
AFTER INSERT ON dbo.calendar
FOR EACH ROW
BEGIN
    INSERT INTO dbo.timecard 
        SELECT emp.id, NEW.date, "no time entered" 
            FROM dbo.employee AS emp
END;

插入 dbo.timecard 的触发器

CREATE TRIGGER newTime
AFTER INSERT ON dbo.timecard
FOR EACH ROW
BEGIN
    DELETE FROM dbo.timecard 
        WHERE punchtime=NEW.punchtime 
            AND id=NEW.id 
            AND punchtype="no time entered"
END;

关于mysql - 我如何根据有限的日历为每个员工创建缺失的日期记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30987383/

相关文章:

MySQL - 存储发送给大量用户的帖子

mysql - 使用 SQS 移动数千个数据库是个好主意吗?

php - 查询返回所需的行,直到添加 LIKE

sql - 如何在 SQL 中计算该月的最后一天?

sql - 各分值范围内的分值百分比

sql - 使 OR 查询更加简化

mysql - 1822, "添加外键约束失败。缺少约束索引

mysql - 查找预订重叠以检查日期可用性

php - Laravel:whereIn 变量

mysql - 如何优化这个 "where IN"和 "where NOT IN"查询?