Вы можете использовать простую функцию, подобную этой, чтобы сгенерировать нужную вам небольшую норму дат:
CREATE FUNCTION dbo.DatesBetween
(
@StartDate date,
@EndDate date
)
RETURNS @Dates TABLE
(
DateNumber int IDENTITY(1,1) PRIMARY KEY,
DateValue date
)
AS
BEGIN
DECLARE @CurrentValue date = @StartDate;
WHILE @CurrentValue <= @EndDate
BEGIN
INSERT @Dates (DateValue) VALUES (@CurrentValue);
SET @CurrentValue = DATEADD(day, 1, @CurrentValue);
END;
RETURN;
END;
GO
Затем измените свой запрос следующим образом.(У него нет данных или таблиц для проверки, но он должен быть близко).
CREATE PROCEDURE [dbo].[Sp_Rsv_DailyContractReport]
@ContractDate datetime =null,
@RegisterUsersId varchar(32) = null
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
SELECT db.DateValue AS [Date],
ISNULL(SUM(c.Price) , 0) AS TotalPrice,
ISNUll(COUNT(c.[Id]) ,0) AS ContractCount
FROM dbo.DatesBetween(@ContractDate, SYSDATETIME()) AS db
LEFT OUTER JOIN dbo.Rsv_Contract as c
ON db.DateValue = CAST(c.ContractDate AS date)
WHERE c.RegisterUsersId = @RegisterUsersId
AND c.ContractState IN (1, 2)
AND c.ContractNumber !='0000000'
AND c.ContractNumber != '-1'
GROUP BY db.DateValue;
END;
GO