在 table 中存储动作的时间戳
store timestamp of an action in a table
我在这里有一个问题:
alter proc spbadge
@WeekNumber nvarchar(255)
as
begin
update pointsbadge
set
badge1 =(case when WeeklyHoursLogged >= '40' then 1 else 0 end),
badge2 = (case when WeeklyHoursLogged<'40' then 1 else 0 end),
badge3 = (case WHEN WeeklyHoursLogged >= 50 and WeeklyHoursLogged < 55 THEN '1' else 0 end),
badge4 = (case WHEN WeeklyHoursLogged >= 55 and WeeklyHoursLogged < 60 THEN '1' else 0 end),
badge5 = (case WHEN WeeklyHoursLogged >= 60 THEN '1' else 0 end);
end
现在,在 运行 上面的条件查询之后,我更新了这个 "pointsBadge" table -
场景:
在这里您将看到 5 个徽章(徽章 1 到徽章 5)。当任何员工获得徽章时,它变为 1,否则为 0。例如:Brinda 赢得所有徽章,而 lyka 仅赢得徽章 1。
问题 :我想要另一个 table "employee_badge" - 每当任何员工获得徽章奖励时,即每当她的值为 1 时,在这个 "employee_badge" table 中,employeeid,badgeid 和时间被记录下来。
比如像这样,
我将徽章的图像和 ID 存储在不同的 table 中,如下所示:
你们认为这会怎样 achieved.can 我修改了上面的存储过程或者你提出了一个更有效的解决方案。我相信我需要使用更新触发器 here.But ,如何我会在上面的存储过程中使用它吗?
请检查以下代码,如果它满足您的要求:您可以根据您的table结构和数据调整查询
--徽章点信息
CREATE TABLE pointsBadge(EmployeeName VARCHAR(50), EmployeeID INT, badge1 INT, badge2 INT, badge3 INT, badge4 INT, badge5 INT)
INSERT INTO pointsBadge VALUES
('Lyka', 1122, 1, 1, 0, 0, 0),
('Brinda', 2233, 0, 0, 0, 0, 0),
('Anil', 34, 1, 1, 0, 0, 1)
--新 table 以员工明智的方式存储带有当前时间戳的徽章数据
CREATE TABLE employee_badge(id INT IDENTITY(1,1), employee_id INT, badge_id INT, earned_on DATETIME)
--徽章信息Table
CREATE TABLE #badges(BadgeId INT IDENTITY(1, 1), BadgeName VARCHAR(50))
INSERT INTO #badges VALUES
('Badge1'),
('Badge2'),
('Badge3'),
('Badge4'),
('Badge5'),
('Badge6')
--触发插入数据到employee_badge table with updated data
IF OBJECT_ID('[dbo].[TRGUpdate_badge_info]', 'TR') IS NOT NULL
DROP TRIGGER dbo.TRGUpdate_badge_info
GO
CREATE TRIGGER dbo.TRGUpdate_badge_info ON dbo.pointsBadge
FOR UPDATE
AS
INSERT INTO employee_badge
SELECT d.EmployeeID,
b.BadgeId,
GETDATE()
FROM pointsBadge p
INNER JOIN DELETED d ON p.EmployeeID = d.EmployeeID
INNER JOIN #badges b ON b.BadgeName = CASE WHEN (p.badge1 <> d.badge1) THEN 'Badge1'
WHEN (p.badge2 <> d.badge2) THEN 'Badge2'
WHEN (p.badge3 <> d.badge3) THEN 'Badge3'
WHEN (p.badge4 <> d.badge4) THEN 'Badge4'
WHEN (p.badge5 <> d.badge5) THEN 'Badge5'
END
GO
UPDATE pointsBadge SET badge5 = 2 WHERE employeeID = 1122
SELECT * FROM employee_badge
我在这里有一个问题:
alter proc spbadge
@WeekNumber nvarchar(255)
as
begin
update pointsbadge
set
badge1 =(case when WeeklyHoursLogged >= '40' then 1 else 0 end),
badge2 = (case when WeeklyHoursLogged<'40' then 1 else 0 end),
badge3 = (case WHEN WeeklyHoursLogged >= 50 and WeeklyHoursLogged < 55 THEN '1' else 0 end),
badge4 = (case WHEN WeeklyHoursLogged >= 55 and WeeklyHoursLogged < 60 THEN '1' else 0 end),
badge5 = (case WHEN WeeklyHoursLogged >= 60 THEN '1' else 0 end);
end
现在,在 运行 上面的条件查询之后,我更新了这个 "pointsBadge" table -
场景: 在这里您将看到 5 个徽章(徽章 1 到徽章 5)。当任何员工获得徽章时,它变为 1,否则为 0。例如:Brinda 赢得所有徽章,而 lyka 仅赢得徽章 1。
问题 :我想要另一个 table "employee_badge" - 每当任何员工获得徽章奖励时,即每当她的值为 1 时,在这个 "employee_badge" table 中,employeeid,badgeid 和时间被记录下来。
比如像这样,
我将徽章的图像和 ID 存储在不同的 table 中,如下所示:
你们认为这会怎样 achieved.can 我修改了上面的存储过程或者你提出了一个更有效的解决方案。我相信我需要使用更新触发器 here.But ,如何我会在上面的存储过程中使用它吗?
请检查以下代码,如果它满足您的要求:您可以根据您的table结构和数据调整查询
--徽章点信息
CREATE TABLE pointsBadge(EmployeeName VARCHAR(50), EmployeeID INT, badge1 INT, badge2 INT, badge3 INT, badge4 INT, badge5 INT)
INSERT INTO pointsBadge VALUES
('Lyka', 1122, 1, 1, 0, 0, 0),
('Brinda', 2233, 0, 0, 0, 0, 0),
('Anil', 34, 1, 1, 0, 0, 1)
--新 table 以员工明智的方式存储带有当前时间戳的徽章数据
CREATE TABLE employee_badge(id INT IDENTITY(1,1), employee_id INT, badge_id INT, earned_on DATETIME)
--徽章信息Table
CREATE TABLE #badges(BadgeId INT IDENTITY(1, 1), BadgeName VARCHAR(50))
INSERT INTO #badges VALUES
('Badge1'),
('Badge2'),
('Badge3'),
('Badge4'),
('Badge5'),
('Badge6')
--触发插入数据到employee_badge table with updated data
IF OBJECT_ID('[dbo].[TRGUpdate_badge_info]', 'TR') IS NOT NULL
DROP TRIGGER dbo.TRGUpdate_badge_info
GO
CREATE TRIGGER dbo.TRGUpdate_badge_info ON dbo.pointsBadge
FOR UPDATE
AS
INSERT INTO employee_badge
SELECT d.EmployeeID,
b.BadgeId,
GETDATE()
FROM pointsBadge p
INNER JOIN DELETED d ON p.EmployeeID = d.EmployeeID
INNER JOIN #badges b ON b.BadgeName = CASE WHEN (p.badge1 <> d.badge1) THEN 'Badge1'
WHEN (p.badge2 <> d.badge2) THEN 'Badge2'
WHEN (p.badge3 <> d.badge3) THEN 'Badge3'
WHEN (p.badge4 <> d.badge4) THEN 'Badge4'
WHEN (p.badge5 <> d.badge5) THEN 'Badge5'
END
GO
UPDATE pointsBadge SET badge5 = 2 WHERE employeeID = 1122
SELECT * FROM employee_badge