仅将日期作为参数传递给存储过程以获取结果

时间:2015-09-16 09:24:58

标签: sql-server date datetime stored-procedures

我刚创建了以下存储过程

CREATE PROCEDURE [dbo].[FindIncomplete_Products]
     @type nvarchar(250),
     @category nvarchar(250),
     @country nvarchar(250),
     @subsidary nvarchar(250),
     @date datetime
AS
Begin  
    select  [dbo].[AB_Product].[ProductID],
            [dbo].[AB_Product].[ProductTitleEn],
            [dbo].[AB_Product].[ProductTitleAr], 
            [dbo].[AB_Product].[Status],
            [dbo].[AB_ProductType].[ProductTypeNameEn],
            [dbo].[AB_ProductType].[ProductTypeNameAr], 
            [dbo].[AB_ProductTypeCategory].[ProductCategoryNameEn],
            [dbo].[AB_ProductTypeCategory].[ProductCategoryNameAr],
            [dbo].[AB_Subsidary].[SubsidaryNameEn],
            [dbo].[AB_Subsidary].[SubsidaryNameAr],
            [dbo].[AB_Subsidary].[Country]
    from 
        [dbo].[AB_Product]
    inner join 
        [dbo].[AB_ProductType] on [dbo].[AB_ProductType].[ProductTypeID] = [dbo].[AB_Product].[ProductTypeID]
    inner join 
        [dbo].[AB_ProductTypeCategory] on [dbo].[AB_ProductTypeCategory].[ProductCategoryID] = [dbo].[AB_Product].[ProductCategoryID]
    inner join 
        [dbo].[AB_Subsidary] on [dbo].[AB_Subsidary].[SubsidaryID] = [dbo].[AB_Product].[Subsidary_ID]
    WHERE 
       (@type IS NULL OR [dbo].[AB_Product].[ProductTypeID]  LIKE '%' +  @type + '%')
       AND (@category IS NULL OR [dbo].[AB_Product].[ProductCategoryID] LIKE '%' +  @category + '%')
       AND (@country IS NULL OR [dbo].[AB_Subsidary].[Country] LIKE '%' +  @country + '%')
       AND (@subsidary IS NULL OR [dbo].[AB_Product].[Subsidary_ID] LIKE '%' +  @subsidary + '%')
       AND (@date IS NULL OR [dbo].[AB_Product].[CreatedDate] = @date)
End

我的数据库字段是日期时间字段[dbo].[AB_Product].[CreatedDate]当我访问此存储过程时,我以此格式mm-dd-yyyy传递了数据参数的值。

因为这是为“创建日期”字段寻找确切的值,AND ([dbo].[AB_Product].[CreatedDate] = @date)我无法获得所有类似的结果。

例如,如果我想搜索创建日期为2015-08-27的所有产品,一旦我将其作为参数值传递,我无法获得创建日期的所有结果2015-08-27只有我可以获得结果已创建日期2015-08-27 00:00:00.000。我错过了创建日期值为2015-08-27 13:03:50.647

等结果

1 个答案:

答案 0 :(得分:1)

使用DateDiff函数代替=来比较日期。示例如下所示。

declare @str nvarchar(25)
set @str = '2015-09-17'
print datediff(d,getdate(),@str)

DateDiff将返回两个日期之间的天数差异。所以改变你的最后一行如下。

(@date IS NULL OR datediff(d,[dbo].[AB_Product].[CreatedDate],@date) = 0)

DateDiff的工作原理如下。

DATEDIFF ( datepart , startdate , enddate )

您可以在herehere ....

上阅读有关DateDiff的信息