2016-12-27 2 views
1

Nous utilisons un framework de très haut niveau, appelé Instant Developer, où les parties de date sont implémentées sous forme de chaînes. En implémentant une interface, j'ai ajouté à la bibliothèque de mon projet la fonction DATEADD (datepart , number , date) de SQL Server. Mais quand je l'appelle, le code généré est, par exemple,SQL Server: convertir la chaîne 'n', 'hh', 'd' en variables globales n, hh et d

SELECT dateadd('n',90,CONVERT(datetime, DATEREQUEST+TIMEREQUEST)) 
FROM [Ergo].[dbo].[MANUTENZIONI] 
where TICKETMANUTE = 17723 

mais SQL Server augmente exception hache depuis le premier paramètre de dateadd() fonction est incorrect, car il est pas censé être une chaîne mais une variable globale. Y a-t-il un moyen de le convertir? Quelque chose comme:

dateadd(case when 'n'='n' then n end, 90, CONVERT(datetime, DATEREQUEST+TIMEREQUEST)) 
+0

pourquoi vous ne pouvez pas générer 'dateadd (n, 90, CONVERT (datetime, DATEREQUEST + TIMEREQUEST)) '? – Backs

+0

Comme solution de contournement, créez des fonctions wrapper 'dateadd_N (int, datetime)', 'dateadd_D (int, datetime)', ... – Serg

+0

Parce que mon framework ne me laisse pas ... comme je l'ai écrit, les parties date sont implémentées comme des chaînes. Donc, si j'appelle 'dateAdd (Minutes, 90, date)' que Minutes est traduit en 'n' ... –

Répondre

2

Créer une fonction wrapper qui accepte varchar comme un type d'intervalle

create function myDateadd(@type varchar(5), @amount int, @dt datetime) 
returns datetime 
as 
begin 
return case @type 
     when 'n' then dateadd(n, @amount, @dt) 
     when 'd' then dateadd(d, @amount, @dt) 
     -- ... 
     end; 
end 
go 

select dbo.myDateadd('n',60,getdate());