存储过程中的动态日期参数

时间:2017-08-18 22:03:54

标签: sql sql-server tsql stored-procedures type-conversion

我正在尝试将上个月的第一天和最后一天作为我的存储过程中的日期参数传递,但它正在抛出数据转换错误,如下所示:

从字符串转换日期和/或时间时转换失败。

以下是我传递参数的示例;

EXEC DBO.usp_PRODUCTS 'DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 1, 0)'
                            ,'DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), -1)'

我的存储过程中的开始日期和结束日期的数据类型是日期,即使我更改为varchar,它也显示类似的错误。

有没有办法可以将我上个月的第一天和最后一天作为参数传递给我的存储过程?

2 个答案:

答案 0 :(得分:0)

试试这个

Declare @startDate Date = DATEADD(m,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()), 0));
Declare @endDate Date =DATEADD(d,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0));

EXEC DBO.usp_PRODUCTS @startDate , @endDate  ;

答案 1 :(得分:0)

如果您使用的是SQLServer 2012或更高版本,则可以使用EOMonth函数返回该月的最后一天,上个月的偏移量为-1:

EXEC DBO.usp_PRODUCTS 
    DateAdd(day,1,EOMonth(GetDate(),-2)),
    EOMonth(GetDate(),-1)