DATEPART作为参数

时间:2010-10-15 15:38:09

标签: sql sql-server tsql sql-server-2008 stored-procedures

我猜这是不可能的,因为引擎不喜欢它,但有没有办法(禁止动态SQL)将DATEPART作为参数传递给过程?

5 个答案:

答案 0 :(得分:12)

一个选项是使用带参数的CASE(最好使用int枚举而不是字符串):

declare @part varchar(10)
set @part = 'YEAR'
select case @part 
            when 'YEAR' then datepart(yy, SomeDateTimeColumn) 
            when 'MONTH' then datepart(mm, SomeDateTimeColumn) 
            else datepart(dd, SomeDateTimeColumn) 
        end
from SomeTable

答案 1 :(得分:2)

没有。没有“年”数据类型。你可以这样做:

CREATE PROC myproc @Year int, @Month tinyint

由于DATEPART部分是文字

,因此失败
DECLARE @part varchar(10)
SET @part = 'month'
SELECT DATEPART(@part, GETDATE());

或者这个和IF ELSE

CREATE PROC myproc @WhoeDate datetime, @part varchar(10) /* year. month etc*/

答案 2 :(得分:1)

为什么不能直接传递从Datepart创建的日期?

DECLARE @datepart DATETIME
SET @datepart = DATEPART(yyyy, GetDate())

exec spName @datepart

答案 3 :(得分:0)

如果您正在尝试创建动态存储过程,可以使用以下代码来帮助您实现此目的。

当你定义sp的主体时,记住你需要使用exec sql key-word来执行sql语句:

create proc sp_dinamic_procedure(@datepart_sql varchar(20), @datepart_var varchar(8) )
as
begin   
    declare @query varchar(100) 
    select @query = "select date from table1 t1 where datepart(" + @datepart_var + ", t1.fecha1) = " + @datepart_sql
    exec @query
end

然后,您可以根据需要将任何sql语句作为单个字符串传递给存储过程:

declare @datepart_sql varchar(20), @datepart_var varchar(8)
select @datepart_sql = "datepart(year,getdate()", @datepart_var = "year"
exec sp_dinamic_procedure @datepart_sql, @datepart_var

答案 4 :(得分:0)

最佳解决方案是始终添加月份(如果您需要在该级别上添加几天),并使用整数值。像这样的东西

DECLARE @AddMonths INT = 12
SELECT 
  Sales_DateTime, DATEADD(DAY, -1, DATEADD(MONTH, @AddMonths, DATEADD(DAY, 1, Sales_DateTime ))) 
FROM tSales

并且我认为如何仅添加一个月:)