以日期为参数在 T-SQL 中执行存储过程

zhu*_*ien 2 t-sql sql-server stored-procedures date

我需要创建一个以供应商名称、开始日期和结束日期为参数的存储过程,并计算给定时间间隔内该供应商的总收入。我正在使用北风。该过程如下所示:

CREATE PROC usp_GetTotalIncomeByPeriod (
    @companyName nvarchar(40),
    @startDate date,
    @endDate date)
AS
    BEGIN
        SELECT SUM(od.UnitPrice * od.Quantity * (1 - od.Discount))
        FROM Orders o
            JOIN [Order Details] od
                ON o.OrderId = od.OrderId
            JOIN Products p
                ON od.ProductID = p.ProductID
            JOIN Suppliers s
                ON p.SupplierID = s.SupplierID
        WHERE s.CompanyName = @companyName
            AND (o.OrderDate BETWEEN @startDate AND @endDate);
    END
GO
Run Code Online (Sandbox Code Playgroud)

问题是我实际上无法使用以下调用执行它:

EXEC dbo.usp_GetTotalIncomeByPeriod @companyName = 'Exotic Liquids', 
                                    @startDate = DATEFROMPARTS(1900, 01, 01),
                                    @endDate = DATEFROMPARTS(2000, 1, 1);
Run Code Online (Sandbox Code Playgroud)

DATEFROMPARTS 函数本身似乎可以正常工作,但我无法使其作为参数工作。它不断给我“接近 1900 年的语法不正确”。我想念什么?

var*_*run 6

函数的括号

  DATEFROMPARTS()
Run Code Online (Sandbox Code Playgroud)

导致错误。因此,要么直接传递日期而不使用该函数,要么使用 PLSQL 块通过将 DATEFROMPARTS() 的结果存储在变量中然后将该变量传递给存储过程来执行此操作。

 DECLARE    
    @return_value int,
    @vDate1 date,
    @vDate2 date

SET @vDate1=DATEFROMPARTS(1900, 01, 01);
SET @vDate2=DATEFROMPARTS(2000, 01, 01);

EXEC @return_value = dbo.usp_GetTotalIncomeByPeriod 
                                @companyName = 'Exotic Liquids', 
                                @startDate = @vDate1,
                                @endDate = @vDate2;
Run Code Online (Sandbox Code Playgroud)