我有一個包含員工生日的表格。我正在嘗試創建一個存儲過程,在給定的日期內返回所有人的生日。我們有員工在閏年出生。SQL Server:閏年的生日
我能順利拿到返回一個人的時候,他們的生日在http://www.berezniker.com/content/pages/sql/microsoft-sql-server/birthday-query-ms-sql-server
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
謝謝@RomanPekar。像魅力一樣工作,喜歡小提琴的例子!例如,如果我們的數據庫中有100,000,000多人,並且我們正在搜索一個較小的時間範圍,比如說1個月,那麼'WHERE'子句不會放在'CTE_DOB'內部,所以我們不會交叉行?或者有更好的方法嗎? – RoLYroLLs
好吧,無論如何,它會被全面掃描,除非你創建一個特殊的領域,如月,並建立和索引t –
謝謝!我估計。 – RoLYroLLs