我猜这是不可能的,因为引擎不喜欢它,但有没有办法(禁止动态SQL)将DATEPART
作为参数传递给过程?
答案 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
并且我认为如何仅添加一个月:)