我有一个员工生日的表格。我想创建一个存储过程,返回在给定日期范围内所有人的生日。我们有在闰年出生的员工。
我可以成功地按照这个例子查询到在闰年出生的员工生日。
然而,根据上述数据,我的目标是显示
另外,如果您有兴趣,我的完整意图如下:
我想传递两个日期,无论相隔多远:
我可以成功地按照这个例子查询到在闰年出生的员工生日。
DECLARE @StartDate DATETIME, @EndDate DATETIME
SET @StartDate = '2009-02-22'
SET @EndDate = '2009-02-28'
--SET @StartDate = '2008-02-22'
--SET @EndDate = '2008-02-29'
SELECT
FullName,
DATEPART(MONTH, dob) AS MONTH,
DATEPART(DAY, dob) AS DAY,
CONVERT(VARCHAR(10), dob, 111) AS dob
FROM
People
WHERE
DATEADD(YEAR, DATEDIFF(YEAR, dob, @StartDate), dob) BETWEEN @StartDate AND @EndDate
OR
DATEADD(YEAR, DATEDIFF(YEAR, dob, @EndDate), dob) BETWEEN @StartDate AND @EndDate
ORDER BY
CASE WHEN DATEADD(YEAR, DATEDIFF(YEAR, dob, @StartDate), dob)
BETWEEN @StartDate AND @EndDate THEN 1 ELSE 2 END,
DATEPART(MONTH, dob), DATEPART(DAY, dob)
CREATE TABLE People
(
PK INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
FullName VARCHAR(30) NOT NULL,
dob DATETIME NULL
)
GO
INSERT INTO People (FullName, dob) VALUES ('John Smith', '1965-02-28')
INSERT INTO People (FullName, dob) VALUES ('Alex Black', '1960-02-29')
INSERT INTO People (FullName, dob) VALUES ('Bill Doors', '1968-02-27')
...
--shortened for clarity
然而,根据上述数据,我的目标是显示
Alex Black
在 2014 年的生日为 2/28/2014
,在 2016 年的生日为 2/29/2016
。另外,如果您有兴趣,我的完整意图如下:
我想传递两个日期,无论相隔多远:
@DateFrom date = '1/1/2014'
和 @DateTo date = '12/31/2016'
。我希望返回的结果是:FULLNAME DOB
Bill Doors 2014-02-27
John Smith 2014-02-28
Alex Black 2014-02-28
Bill Doors 2015-02-27
John Smith 2015-02-28
Alex Black 2015-02-28
Bill Doors 2016-02-27
John Smith 2016-02-28
Alex Black 2016-02-29 -- note this year the date is feb 29th