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 :

Requête dateadd non fonctionelle


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Femme Profil pro
    PL/SQL
    Inscrit en
    Septembre 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : Arabie Saoudite

    Informations professionnelles :
    Activité : PL/SQL
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 189
    Points : 65
    Points
    65
    Par défaut Requête dateadd non fonctionelle
    bonjour a tous

    j'ai une petit requête qui doit générer tout les dates entre deux dates stardate et enddate ,j'arrive pas a comprendre pourquoi ma requête n'est pas Fonctionnelle le colonne date ne s'incrémente pas
    Qui a une idée ou se bloque
    je casse ma tete et rien ne se règle!!!!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    declare @startdate datetime2='2016-01-01 00:00:00.000'
    declare @enddtae datetime2='2017-01-01 00:00:00.000'
    ;with cte as
    ( select 1 as n, @startdate as stardate
    union all
    select n+1,dateadd(day,1,@startdate)
    from cte 
    where @startdate<@enddtae
    )select * from cte OPTION (MAXRECURSION 0);
    merci pour vos aide
    Images attachées Images attachées  

  2. #2
    Membre éclairé Avatar de Bernardos
    Homme Profil pro
    Consultant Senior dba sql server & Microsoft Business Intelligence
    Inscrit en
    Avril 2008
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant Senior dba sql server & Microsoft Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 332
    Points : 723
    Points
    723
    Par défaut
    Bonjour,
    j'ai trouvé ce topic sur le forum
    voici un script qui fonctionne.
    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
    declare @dt1 datetime;
    declare @dt2 datetime;
     
    set @dt1 = CONVERT(datetime, '01/04/2012', 103);
    set @dt2 = CONVERT(datetime, '31/05/2012', 103);
     
    With Calendrier (dt) as
    (
    select @dt1
     union all
    select dt + 1
      from Calendrier
     where dt < @dt2
    )
      select dt
        from Calendrier
    order by dt asc;
    il est égalment question sur le sujet d'un article de sql pro qui prône l'utilisation de table calendrier.
    Cordialement,

  3. #3
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Points : 10 543
    Points
    10 543
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Ca ne marche pas car la CTE est complètement foireuse : vous ajoutez 1 à la date de départ, et ceci, tout le temps !

    Voici une version qui marche :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    declare @startdate datetime2='2016-01-01 00:00:00.000'
    declare @enddtae datetime2='2017-01-01 00:00:00.000'
    ;
     
    with cte as
    ( select 1 as n, @startdate as stardate
    union all
    select n+1,dateadd(day,n,@startdate)
    from cte 
    where dateadd(day,n,@startdate)<@enddtae
    )select * from cte OPTION (MAXRECURSION 0);

    Notez :
    • dateadd(day,n,@startdate), qui permet de rajouter non pas 1 jour, mais n jour en fonction de la profondeur de la récursivité
    • where dateadd(day,n,@startdate)<@enddtae, qui permet d'éviter d'avoir une récursion infinie, votre condition initial @startdate<@enddtae étant toujours vraie

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 897
    Points : 53 135
    Points
    53 135
    Billets dans le blog
    6
    Par défaut
    Effectivement farcie de bug !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    declare @startdate datetime2='2016-01-01 00:00:00.000'
    declare @enddate datetime2='2017-01-01 00:00:00.000'
    ;with cte as
    ( select @startdate as startdate
    union all
    select dateadd(day,1,startdate)
    FROM cte
    where startdate<@enddate)
    SELECT *
    from cte;
    A +

  5. #5
    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,

    Voici une alternative : on génère les nombres positifs, et on les ajoute à la date de début; on restreint le résultat par la date de fin :

    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
    21
    22
    DECLARE @start_date datetime2 = '2016-01-01'
    	, @end_date datetime2='2017-01-01';
     
    WITH
    	N AS (SELECT NULL AS v UNION ALL SELECT NULL)
    	, N1 AS (SELECT A.v FROM N AS A CROSS JOIN N AS B)
    	, N2 AS (SELECT A.v FROM N1 AS A CROSS JOIN N1 AS B)
    	, N3 AS (SELECT A.v FROM N2 AS A CROSS JOIN N2 AS B)
    	, N4 AS (SELECT A.v FROM N3 AS A CROSS JOIN N3 AS B)
    	, DT AS
    	(
    		SELECT	DATEADD
    			(
    				day
    				, ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) - 1 -- pour avoir le zéro
    				, @start_date
    			) AS dt
    		FROM	N4
    	)
    SELECT	dt
    FROM	DT
    WHERE	dt < @end_date
    Attention à la récursivité : si l'on spécifie une jointure sur l'expression de table commune, il peut s'en suivre des problèmes de performances.

    @++

Discussions similaires

  1. "Opération annulée" sur requête de non-correspondance
    Par tedparker dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 23/11/2009, 17h18
  2. Requête de non correspondance et Ajout
    Par gentoo dans le forum Access
    Réponses: 5
    Dernier message: 29/01/2007, 13h52
  3. Requête de non correspondance.
    Par euskal75 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 29/11/2006, 16h47
  4. Réponses: 1
    Dernier message: 28/06/2006, 13h31
  5. Cas spécial de requête de non-correspondance
    Par Floch dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 21/06/2006, 12h19

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