IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

fonction table pour récupérer la liste des jours entre deux dates


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 9
    Points : 8
    Points
    8
    Par défaut fonction table pour récupérer la liste des jours entre deux dates
    Je veux créer une fonction table pour récupérer la liste des jours entre deux dates données ;
    J’ai essayé avec le code suivant


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    create function getJours(@datdeb as datetime, @datfin as datetime)
    returns table
    as
    begin
       if (@datfin <> @datdeb)   
          return (
          select @datdeb 
          union
          select * from getJours(dateadd(d, @datdeb, 1), @datfin)
          )
       
       else
       
          return (select dateadd(d, @datdeb, 1))
       
    end
    Mais je trouve cette erreur

    Msg 178, Niveau 15, État 1, Procédure getJours, Ligne 6
    Une instruction RETURN avec une valeur de retour ne peut être utilisée dans ce contexte.
    Msg 178, Niveau 15, État 1, Procédure getJours, Ligne 14
    Une instruction RETURN avec une valeur de retour ne peut être utilisée dans ce contexte.
    Msg 102, Niveau 15, État 31, Procédure getJours, Ligne 18
    Syntaxe incorrecte vers 'BEGIN'.

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Il y a deux erreurs dans la définition de votre fonction :

    - C'est une fonction table en ligne, donc elle ne peut pas contenir de BEGIN, n ide IF.
    Elle doit contenir une instruction RETURN qui contient un SELECT.

    - Vous avez mélangé valeurs scalaire (select @datdeb) et fonction table (select * from getJours(dateadd(d, @datdeb, 1), @datfin)).

    Une autre écriture aurait pu être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE FUNCTION getJours(@datdeb as datetime, @datfin as datetime)
    	RETURNS TABLE
    AS
    	RETURN
    	(
    		SELECT @datdeb
    		UNION ALL SELECT dbo.getJours(DATEADD(day, 1, @datdeb), @datfin)
    	)
    Mais le moteur ne trouve pas la définition de getJours puisqu'elle n'existe pas encore.

    Vous devez donc écrire une fonction multi-instructions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    CREATE FUNCTION fn_getJours
    	(
    		@_dateDeb datetime
    		, @_dateFin datetime
    	)
    	RETURNS @tb_dates TABLE
    	(
    		dates datetime NOT NULL
    	)
    	WITH SCHEMABINDING
    AS
    BEGIN
    	WHILE @_dateDeb <= @_dateFin
    	BEGIN
    		INSERT INTO @tb_dates (dates) VALUES (@_dateDeb)
    		SELEcT @_dateDeb = DATEADD(day, 1, @_dateDeb)
    	END
     
    	RETURN
    END
    Néanmoins sachez que les fonctions sont loin d'être performantes, et que le moteur de base de données n'est pas conçu pour effectuer des calculs itératifs.

    Pour éviter cela, vous pouvez créer une table de dates, comme je le montre ici

    @++

  3. #3
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    merci elsuket
    ton code marche bien pour mois
    j'espere que j'aurais le temps pour voir ta table date
    et merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Liste des jours entre deux dates
    Par rvzip64 dans le forum Requêtes
    Réponses: 12
    Dernier message: 01/09/2015, 16h00
  2. nombre des jours entres deux dates
    Par adriennoob dans le forum VBA Access
    Réponses: 4
    Dernier message: 04/09/2009, 14h04
  3. Liste des mois entre deux dates
    Par ginkas31 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 10/03/2008, 16h33
  4. Réponses: 2
    Dernier message: 06/11/2006, 14h35
  5. Générer le listing des jours entre deux dates
    Par gsmdu62 dans le forum Langage
    Réponses: 8
    Dernier message: 01/05/2006, 11h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo