65.9K
CodeProject 正在变化。 阅读更多。
Home

SQL Server:查找本周即将生日的查询

starIconstarIconstarIconstarIconstarIcon

5.00/5 (10投票s)

2012 年 9 月 13 日

CPOL

1分钟阅读

viewsIcon

82572

这是“SQL Server:查找本周即将生日的查询”的替代方案

引言

这是对 aasim abdullah 提供的原始技巧 'SQL Server:查询本周即将到来的生日' 的替代方案。

对原始技巧的修改

与原始技巧相比,此替代方案进行了一些修改。

第一个区别是使用 date 数据类型代替 datetime 来存储出生日期 (DOB)。 这使得处理日期和将其与当前日期进行比较更容易一些。

第一个查询,用于检索生日在给定日期范围内的员工,也可以表示为以下形式

--Create table variable to hold our test records
DECLARE @Workers TABLE (WorkerName VARCHAR(50), DOB DATE);

--Insert test records
INSERT INTO @Workers
SELECT 'Ryan',    '1972-08-24' UNION ALL
SELECT 'James',   '1985-09-26' UNION ALL
SELECT 'Jasson',  '1983-08-25' UNION ALL
SELECT 'Tara',    '1991-09-24' UNION ALL
SELECT 'William', '1992-08-19' UNION ALL
SELECT 'Judy',    '1989-09-15';

--Variable to provide required number of days
DECLARE @InNextDays INT;
SET @InNextDays = 3;

-- Query to find workers, whose birthday is in given number of days
SELECT *
FROM @Workers 
WHERE DATEADD( Year, DATEPART( Year, GETDATE()) - DATEPART( Year, DOB), DOB)
      BETWEEN CONVERT( DATE, GETDATE()) 
      AND CONVERT( DATE, GETDATE() + @InNextDays);

其思想是,将实际生日通过加上出生年份与当前年份之间的年数来转移到当前年份。 之后,使用简单的日期范围比较。

检索本周生日的员工的第二个查询可以这样编写

-- Query to find workers, whose birthday is in current week
SELECT * 
FROM @Workers
WHERE DATEPART( Week, DATEADD( Year, DATEPART( Year, GETDATE()) - DATEPART( Year, DOB), DOB))
      = DATEPART( Week, GETDATE());

基本思想与我解释的第一个查询相同。 只是这次比较的是周数。

注意:在示例中,使用了默认的周编号,因此根据要求,查询可能需要调整为使用不同的周数(例如 ISO 周)。 有关更多信息,请参阅 DATEPART

历史

  • 2012 年 9 月 13 日:创建替代方案。


© . All rights reserved.