繁体   English   中英

如何将空白值传递给日期参数?

[英]How to pass blank value to date parameter?

我有一个带有 3 个参数的程序。 一切正常,直到我按月、周或日执行程序(例如“2020-07-27”)。 当我将“0”作为@DateDay 参数传递时,结果我得到了一堆记录(全部来自 2020 年)。 我想返回的是 0 条记录。 这是我的查询:


ALTER PROCEDURE [dbo].[proc]

@DateDay VARCHAR,
@DateWeek INT,
@DateMonth INT

AS
BEGIN
SET NOCOUNT ON;

DECLARE @Year INT = DATEPART(YEAR,GETDATE())

SELECT
o.OrderNr,
c.CustomerName


FROM [dbo].Orders o
    INNER JOIN dbo.Customer c on o.OrderID=c.CustomerID

WHERE
    (CONVERT(VARCHAR,o.CreateDate,23)=@DateDay OR @DateDay='0') AND 
    (MONTH(o.CreateDate)=@DateMonth OR @DateMonth=0) AND
    (DATEPART(ISO_WEEK,o.CreateDate)=@DateWeek OR @DateWeek=0) AND
    DATEPART(YEAR,o.CreateDate)=@Year

END
GO

更准确地说,执行此操作时:

EXEC [dbo].[proc] '0',0,5

我得到了五月的所有记录。 当我执行这个:

EXEC [dbo].[proc] '0',29,0

我得到了第 29 周的所有记录。 当我执行这个:

EXEC [dbo].[proc] '0',0,0

我得到了 2020 年的所有记录。我想返回 0 条记录,因为我没有传递任何日期值。 我的查询有什么问题,我该如何解决这个问题?

这已破了:

ALTER PROCEDURE [dbo].[proc] (
    @DateDay VARCHAR,
-------------^
    @DateWeek INT,
    @DateMonth INT
)

在 SQL 服务器中,始终包含带有字符串声明的长度参数。 默认值因上下文而异; 在这种情况下,您有:

ALTER PROCEDURE [dbo].[proc] (
    @DateDay VARCHAR(1),
    @DateWeek INT,
    @DateMonth INT
)

可能会建议一个更长的字符串:

ALTER PROCEDURE [dbo].[proc] (
    @DateDay VARCHAR(255),
    @DateWeek INT,
    @DateMonth INT
)

但是您似乎正在使用它来进行日期比较。 所以,传入一个date

ALTER PROCEDURE [dbo].[proc] (
    @DateDay DATE,
    @DateWeek INT,
    @DateMonth INT
)

然后使用NULL作为通配符。

要解决您的实际问题,您需要特殊的逻辑来处理“全部为零”的情况:

WHERE (CONVERT(VARCHAR(255),o.CreateDate,23) = @DateDay OR @DateDay = '0') AND 
      (MONTH(o.CreateDate)=@DateMonth OR @DateMonth=0) AND
      (DATEPART(ISO_WEEK, o.CreateDate) = @DateWeek OR @DateWeek = 0) AND
      DATEPART(YEAR, o.CreateDate) = @Year AND
      (@DateDay <> '0' OR @DateMonth <> 0 OR @DateWeek <> 0)

使用DATENULL看起来会有所不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM