Так что это то, что я должен обрабатывать високосные годы, если вы хотите сделать это как хранимую процедуру. Возможно, есть более простой способ, но я не мог придумать один. Вы также можете изменить мой входной параметр на гибкую дату, если планируете использовать SSRS.
Я создал макет таблицы:
CREATE TABLE #tblClaim (statusid INT, incidentdate DATE)
INSERT INTO #tblClaim (statusid, incidentdate)
VALUES (1,'2019-01-15'),(2,'2019-01-15'),(1,'2018-01-15'),(2,'2018-01-15'),
(1,'2017-01-15'),(2,'2016-01-15'),(1,'2012-02-29'),(2,'2012-02-29'),
(1,'2016-02-29'),(2,'2016-02-29'),(1,'2008-02-29'),(2,'2008-02-29'),
(1,'2012-02-28'),(2,'2012-02-28'),(1,'2016-03-01'),(2,'2016-03-01'),
(1,'2008-03-01'),(2,'2008-02-28');
Затем я создал процедуру (отрегулируйте ваши переменные, которые должны отображаться соответственно):
CREATE PROC dbo.myproc as
DECLARE @leapyear INT = 229
DECLARE @date DATE = GETDATE()
--DECLARE @date DATE = '20160229' <---used to test leap year
IF DAY(@date) + (MONTH(@date)*100) = @leapyear
BEGIN
DECLARE @day INT = 1
DECLARE @month INT = 3
DECLARE @day1 INT = 28
DECLARE @month1 INT = 2;
WITH CTE (statusid, incidentdate)
AS
(
SELECT *
FROM #tblClaim
WHERE statusid = 2
AND DAY(incidentdate) = @day
AND MONTH(incidentdate) = @month
UNION ALL
SELECT *
FROM #tblClaim
WHERE statusid = 2
AND DAY(incidentdate) = @day1
AND MONTH(incidentdate) = @month1
UNION ALL
SELECT *
FROM #tblClaim
WHERE statusid = 2
AND DAY(incidentdate) = DAY(@date)
AND MONTH(incidentdate) = MONTH(@date))
SELECT * FROM CTE
END
ELSE BEGIN
SELECT *
FROM #tblClaim
WHERE statusid = 2
AND DAY(incidentdate) = DAY(@date)
AND MONTH(incidentdate) = MONTH(@date)
END
високосный год возвращает эти результаты:
![enter image description here](https://i.stack.imgur.com/LGT4Y.png)
Сегодняшняя дата возвращается:
![enter image description here](https://i.stack.imgur.com/lnP95.png)