2010-10-15 32 views
12

Tôi đoán điều này là không thể vì động cơ không thích nó, nhưng có cách nào (chặn SQL động) để vượt qua trong một DATEPART như một tham số cho một thủ tục?DATEPART như một tham số

Trả lời

10

Một lựa chọn là sử dụng một trường hợp với các tham số (sẽ tốt hơn nếu sử dụng liệt kê int thay vì chuỗi):

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

Tại sao bạn không thể chuyển vào Ngày được tạo từ Datepart?

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

exec spName @datepart 
+0

ý tưởng rất tốt và tôi nghĩ rằng bạn sẽ có câu trả lời của tôi; tuy nhiên, tôi muốn chuyển vào 'YEAR' hoặc 'MONTH', không phải một số * dường như * tùy ý ngày tháng. – Brad

2

Không. Không có loại dữ liệu "năm". Bạn có thể làm điều này:

CREATE PROC myproc @Year int, @Month tinyint 

này sai vì DATEPART phần là một chữ

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

hoặc này và một IF ELSE

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

Nếu bạn đang cố gắng tạo một thủ tục lưu trữ động, mã sau đây có thể giúp bạn đạt được điều này.

Khi bạn xác định cơ thể của sp, hãy nhớ rằng bạn cần phải sử dụng phím chữ exec sql để thực thi câu 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 

Sau đó, bạn có thể vượt qua bất kỳ câu sql để thủ tục lưu trữ của bạn như là một chuỗi dependig duy nhất trên nhu cầu của bạn:

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 
0

giải pháp tốt nhất là luôn thêm tháng (hoặc thậm chí ngày nếu bạn cần nó ở mức độ đó) và để chơi với các giá trị số nguyên. Một cái gì đó như thế này

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

và tôi nghĩ rằng đó là rõ ràng làm thế nào để thêm một tháng chỉ :)

Các vấn đề liên quan