在企业或组织中,了解员工的生日并及时送上祝福是一种常见的员工关怀方式。通过数据库查询,可以轻松地找出即将过生日的员工。本文将介绍如何使用SQL查询来实现这一功能。
首先,需要创建一个表变量来存储测试数据。这个表变量将包含员工的姓名和出生日期。
DECLARE @Workers TABLE (WorkerName VARCHAR(50), DOB DATETIME);
INSERT INTO @Workers VALUES ('Ryan', '1972-08-24 00:00:00');
INSERT INTO @Workers VALUES ('James', '1985-09-26 00:00:00');
INSERT INTO @Workers VALUES ('Jasson', '1983-08-25 00:00:00');
INSERT INTO @Workers VALUES ('Tara', '1991-09-24 00:00:00');
INSERT INTO @Workers VALUES ('William', '1992-08-19 00:00:00');
INSERT INTO @Workers VALUES ('Judy', '1989-09-23 00:00:00');
在这个例子中,创建了一个名为@Workers的表变量,并插入了一些测试数据。每个员工都有唯一的姓名和出生日期。
接下来,需要编写一个查询来找出未来几天内即将过生日的员工。可以通过比较当前日期和员工的出生日期来实现这一功能。
DECLARE @InNextDays INT;
SET @InNextDays = 3;
SELECT * FROM @Workers WHERE 1 = CASE
WHEN MONTH(GETDATE()) < MONTH(GETDATE() + @InNextDays)
THEN CASE
WHEN MONTH(DOB) = MONTH(GETDATE() + @InNextDays)
AND DAY(DOB) BETWEEN DAY(DATEADD(s, -1, DATEADD(mm, DATEDIFF(m, 0, GETDATE()) + 1, 0)) + 1)
AND DAY(GETDATE() + @InNextDays)
THEN 1
WHEN MONTH(DOB) = MONTH(GETDATE())
AND DAY(DOB) BETWEEN DAY(GETDATE()) + 1 AND DAY(GETDATE() + @InNextDays)
THEN 1
ELSE 0
END
ELSE CASE
WHEN MONTH(DOB) = MONTH(GETDATE())
AND DAY(DOB) BETWEEN DAY(GETDATE()) + 1 AND DAY(GETDATE() + @InNextDays)
THEN 1
ELSE 0
END
END;
在这个查询中,首先声明了一个名为@InNextDays的变量,用于存储未来几天的天数。然后,使用CASE语句来比较当前日期和员工的出生日期。如果员工的出生日期在未来几天内,那么查询结果将包含这些员工的信息。
除了查询未来几天内过生日的员工,还可以查询当前周内过生日的员工。这可以通过比较当前日期和员工的出生日期来实现。
SELECT * FROM @Workers WHERE 1 = CASE
WHEN MONTH(GETDATE()) < MONTH(DATEADD(WK, DATEDIFF(WK, 0, GETDATE()) + 1, -1))
THEN CASE
WHEN MONTH(DOB) = MONTH(GETDATE() + 1)
AND DAY(DOB) >= 1 AND DAY(DOB) < DAY(DATEADD(WK, DATEDIFF(WK, 0, GETDATE()) + 1, -1))
THEN 1
WHEN MONTH(DOB) = MONTH(GETDATE())
AND DAY(DOB) >= DAY(GETDATE())
AND DAY(DOB) <= DAY(DATEADD(s, -1, DATEADD(mm, DATEDIFF(m, 0, GETDATE()), 0)))
THEN 1
ELSE 0
END
ELSE CASE
WHEN MONTH(DOB) = MONTH(GETDATE())
AND DAY(DOB) >= DAY(GETDATE()) + 1 AND DAY(DOB) < DAY(DATEADD(WK, DATEDIFF(WK, 0, GETDATE()) + 1, -1))
THEN 1
ELSE 0
END
END;