Sql server Datepart()有没有办法为Datepart间隔使用变量

Sql server Datepart()有没有办法为Datepart间隔使用变量,sql-server,tsql,datepart,Sql Server,Tsql,Datepart,我正在创建一个SQL server存储过程,该过程根据当前周进行大量筛选。我没有传入开始和结束日期,而是传入一个日期并使用Datepart()过滤掉一周 Where DATEPART(WEEK, cd.TurninDate) = DATEPART(WEEK, @StartDate) and DATEPART(YEAR, cd.TurninDate) = DATEPART(YEAR, @StartDate) 我试图做到积极主动,我可以看到经理们要求每月或每季度以及每周进行一次

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

    Where DATEPART(WEEK, cd.TurninDate) = DATEPART(WEEK, @StartDate)
      and DATEPART(YEAR, cd.TurninDate) = DATEPART(YEAR, @StartDate)
我试图做到积极主动,我可以看到经理们要求每月或每季度以及每周进行一次。如果可以的话,我不希望每个版本都有一个存储过程。我想传递频率和日期,但似乎不起作用

我试过:

    Where DATEPART(@Freq, cd.TurninDate) = DATEPART(@Freq, @StartDate)
      and DATEPART(YEAR, cd.TurninDate) = DATEPART(YEAR, @StartDate)
但是我在@Freq上得到一个错误,没有被识别为间隔


有人知道我可以绕过这个问题吗?

没有办法使用变量,但您可以绕过它:

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

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

没有办法使用变量,但您可以解决它:

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

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

MSDN信息非常清楚

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

但要解决这个问题,您可以创建一个动态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作为参数传入。

MSDN信息非常清楚

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

但要解决这个问题,您可以创建一个动态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作为参数传入。

传递开始和结束日期。或开始日期和持续时间(天数)。以您这样做的方式进行过滤无法使用index=>它在大型表上的速度很慢。我的经理是半懂SQL的,他将运行此功能,因此我希望使其尽可能简单。我的目标是让他输入当前日期(或前一周的任何日期)并获得整个星期的数字。我不希望他必须查找一周的第一个日期,或者(当它仅扩展到一周之外时)计算一个月或一个季度中有多少天。幸运的是,不会有太多的记录。一定要传递开始和结束日期。或开始日期和持续时间(天数)。以您这样做的方式进行过滤无法使用index=>它在大型表上的速度很慢。我的经理是半懂SQL的,他将运行此功能,因此我希望使其尽可能简单。我的目标是让他输入当前日期(或前一周的任何日期)并获得整个星期的数字。我不希望他必须查找一周的第一个日期,或者(当它仅扩展到一周之外时)计算一个月或一个季度中有多少天。幸运的是,它永远不会有大量的记录。谢谢你,这正是我要找的。真不敢相信我自己没有想到,因为我以前也做过类似的事情,只是没有约会。谢谢你,这正是我想要的。不敢相信我自己没有想到这一点,因为我以前也做过类似的事情,只是没有使用日期。谢谢,但是日期部分是where子句的一部分,我不想让每个查询都成为动态查询。其中一些相当复杂。谢谢,但是日期部分是where子句的一部分,我不想让每个查询都成为动态查询。其中有些相当复杂。