У меня есть стол с деньгами работников. Я пытаюсь создать хранимую процедуру, которая возвращает дни рождения каждого в течение двух заданных дат. У нас есть работники, рожденные в високосный год.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
«s день рождения в 2014 году как 2/28/2014
и на 2016 год как 2/29/2016
.
Кроме того, если вы находитесь в настроении, мои полные намерения являются следующие:
Я хочу передать 2 даты, не имеет значения, как далеко друг от друга: @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
ну, в любом случае, это будет полная проверка, если вы не создадите специальные поля, такие как месяц, а make и индекс на t –
Спасибо! Я догадался. – RoLYroLLs