1

J'essaye de faire un DB2 UDF qui prend une date d'entrée et renvoie une nouvelle date avec quelques mois ajoutés. La syntaxe de requête pour cette étape est d'utiliserDB2 UDF pour renvoyer une date supplémentaire?

select date + 12 months from sysibm.sysdummy1; 

l'intérieur de l'UDF, je ne peux pas obtenir ce travail

monthsToAdd INTEGER; 
SET monthsToAdd=4; 
set result= inputDate + monthsToAdd + MONTHS; 
return result; 

Il dit

Etat SQL: 42816 Code fournisseur: -182 Message: [SQL0182] Expression de date, d'heure ou d'horodatage non valide. Cause . . . . . : L'un des événements suivants s'est produit: - Un opérande d'addition est une date et l'autre n'est pas une date. - Un opérande d'addition est un temps et l'autre n'est pas une durée. - Un opérande d'addition est un horodatage et l'autre n'est pas une durée. - Un opérande de soustraction est une date et l'autre n'est pas une date, un caractère ou une durée de date. - Un opérande de soustraction est un temps et l'autre n'est pas un temps, un caractère ou une durée. - Un opérande de soustraction est un horodatage et l'autre n'est pas un horodatage, un caractère ou une durée. Récupération . . : Corrigez l'expression arithmétique afin qu'elle contienne une expression de date, d'heure ou d'horodatage valide. Essayez à nouveau la demande.

+0

est l'une erreur Erreur de compilation (pouvez-vous créer la procédure?) ou une erreur d'exécution? Pourriez-vous publier l'intégralité de la procédure de création de procédure? –

+1

N'importe quelle raison pour ne pas simplement utiliser la fonction scalaire DB2 ADD_MONTHS, disponible depuis DB2 pour IBM i 6.1, de janvier 2008; peut-être encore sur v5r4 à l'époque? Pour référence: version plus récente doc sous [IBM i 7.2-> Base de données-> Référence-> Référence SQL-> Fonctions intégrées-> Fonctions scalaires-> ADD_MONTHS] (http://www.ibm.com/support/knowledgecenter /en/ssw_ibm_i_72/db2/rbafzscaaddmonths.htm) – CRPence

Répondre

1

Il est une solution simple:

set result = inputDate + monthsToAdd MONTHS; 
+0

Merci Ian, j'ai essayé cela plus tôt mais ça ne marchera pas il dit 'Fin de l'instruction manquant' –

+0

@ZoHas Alors peut-être, omettez le 'SET' et déclaratif pour' RESULTAT ', et simplement le code' RETURN inputDate + monthsToAdd MONTHS' NB, l'absence d'un point-virgule – CRPence

1

En fait scriptée sur un DB2 V5R3 pour i5/OS [et aussi avec DB2 pour IBM i 7.3]:

create function add_months    
(inputDate DATE      
, monthsToAdd INTEGER     
) returns DATE       
language SQL DETERMINISTIC    
    RETURN inputDate + monthsToAdd MONTHS 

select add_months(date'2016-04-12', 6) 
from sysibm.sysdummy1 
-- likeness of a report from above query follows: 
ADD_MONTHS 
2016-10-12 
+1

Remarque: Le nom ADD_MONTHS a été choisi dans ce qui précède donc les références non qualifiées finiraient par utiliser la fonction scalaire fournie par le système pour les nouvelles requêtes ou recréées VUES lorsqu'elles sont disponibles c'est-à-dire que la création et l'utilisation commencent avec une version antérieure à IBM i 6.1, avec laquelle DB2 for i fournit pour la première fois ce scalaire. – CRPence

Questions connexes