Подтвердить что ты не робот

DATEPART как параметр

Я предполагаю, что это невозможно, так как движок не нравится, но есть ли способ (запрет динамического SQL) передать в DATEPART в качестве параметра процедуры?

4b9b3361

Ответ 1

Один из вариантов - использовать 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

Ответ 2

Нет. Нет типа "год". Вы можете сделать это:

CREATE PROC myproc @Year int, @Month tinyint

Это не выполняется, потому что часть DATEPART является литералом

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

или это, и ЕСЛИ ELSE

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

Ответ 3

Почему вы не можете просто передать дату, созданную из Datepart?

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

exec spName @datepart

Ответ 4

Если вы пытаетесь создать динамическую хранимую процедуру, следующий код поможет вам в этом.

Когда вы определяете тело sp, помните, что вам нужно использовать ключевое слово exec sql для выполнения предложения 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

Ответ 5

Лучшее решение - всегда добавлять месяцы (или даже дни, если вам нужно на этом уровне), и играть с целыми значениями. Что-то вроде этого

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

и я думаю, что это понятно, как добавить только один месяц:)