1

我正在创建一个 SQL Server 存储过程,它根据当前周进行大量过滤。我没有传入开始日期和结束日期,而是传入一个日期并使用 Datepart() 过滤出星期。

    Where DATEPART(WEEK, cd.TurninDate) = DATEPART(WEEK, @StartDate)
      and DATEPART(YEAR, cd.TurninDate) = DATEPART(YEAR, @StartDate)

尽量积极主动,我可以看到经理要求每月或每季度以及每周运行一次。如果我能提供帮助,我宁愿不为每个版本存储一个 Proc。我想传递频率和日期,但它似乎不起作用。

我试过了:

    Where DATEPART(@Freq, cd.TurninDate) = DATEPART(@Freq, @StartDate)
      and DATEPART(YEAR, cd.TurninDate) = DATEPART(YEAR, @StartDate)

但我在@Freq 未被识别为间隔时收到错误消息。

有谁知道我可以解决这个问题的方法?

4

2 回答 2

10

无法使用变量,但您可以解决它:

case
 when @part = 'YEAR' THEN DATEPART(YEAR, cd.TurninDate)
 when @part = 'WEEK' THEN DATEPART(WEEK, cd.TurninDate)
 ...
 END

如您所见,缺乏 SQL/T-SQL 语言的设计。

于 2015-05-27T22:54:48.237 回答
0

MSDN信息很清楚

datepart 是将为其返回整数的日期部分(日期或时间值)。下表列出了所有有效的 datepart 参数。用户定义的等效变量无效

https://msdn.microsoft.com/en-us/library/ms174420.aspx

但是要解决这个问题,您可以创建一个动态 SQL 并用变量填充该部分。

select datepart(year,GETDATE())

declare @DateType varchar(max);
set @DateType = 'YEAR';
declare @datemanip varchar(max);
set @datemanip = 'select datepart(' + @DateType + ',GETDATE())';
execute( @datemanip );

这两个语句都会产生相同的结果。然后,您可以将其放入您的存储过程中,并将 @DateType 作为参数传递。

于 2015-05-27T23:12:37.337 回答