You can change your cursor based approach (get one at a time and do a loop) to a set based approach where you get the desired result in one select. See query below. Use of cursors is often seen as 'not optimal' and 'avoid if you can'
CREATE TABLE [dbo].[Cards](
[Id] [int] IDENTITY(1,1) NOT NULL,
[CustomerId] [int] NOT NULL,
[ExpiryDate] [date] NOT NULL,
[IssueBranch] varchar(100) NOT NULL
CONSTRAINT [PK__Cards] PRIMARY KEY CLUSTERED
(
[Id] ASC
)) ON [PRIMARY]
GO
INSERT INTO [dbo].[Cards]
([CustomerId]
,[ExpiryDate]
,[IssueBranch])
VALUES
(1, DATEADD(day, 7, GETDATE()), 'b1'),
(2, DATEADD(day, 7, GETDATE()), 'b2'),
(3, DATEADD(day, 13, GETDATE()), 'b3'),
(4, DATEADD(day, 14, GETDATE()), 'b4'),
(5, DATEADD(day, 14, GETDATE()), 'b5'),
(6, DATEADD(day, 15, GETDATE()), 'b6')
select * from cards
DECLARE @today datetime2 = cast(GETDATE() as date)
DECLARE @value int
SET @value = 7
SELECT @value AS Interval,DATEADD(DD,@value,@today) AS ExpiresOn, CustomerId, IssueBranch from Cards
where ExpiryDate=CONVERT(DATE, DATEADD(DAY, @value, GETDATE()))
SET @value = 14
SELECT @value AS Interval,DATEADD(DD,@value,@today) AS ExpiresOn, CustomerId, IssueBranch from Cards
where ExpiryDate=CONVERT(DATE, DATEADD(DAY, @value, GETDATE()))
If(OBJECT_ID('tempdb..#ExpirySet') Is Not Null)
Begin
Drop Table #ExpirySet
End
CREATE TABLE #ExpirySet (DeltaDays int, ExpiryDate date)
INSERT INTO #ExpirySet
VALUES
(7, DATEADD(DAY, 7, GETDATE()) ),
(14, DATEADD(DAY, 14, GETDATE()) ),
(21, DATEADD(DAY, 21, GETDATE()) ),
(30, DATEADD(DAY, 30, GETDATE()) ),
(60, DATEADD(DAY, 60, GETDATE()) ),
(90, DATEADD(DAY, 90, GETDATE()) )
SELECT te.DeltaDays AS Interval
,DATEADD(day, te.DeltaDays, GETDATE()) AS ExpiresON
,tc.CustomerId
,tc.IssueBranch
FROM #ExpirySet te INNER JOIN Cards tc
ON te.ExpiryDate = tc.ExpiryDate