Welcome to Sign in | Help
in Search

Am nevoie de ajutor!

Last post 01-09-2008, 12:20 PM by ThePuiu. 6 replies.
Sort Posts: Previous Next
  •  01-08-2008, 11:50 PM 3743

    Am nevoie de ajutor!

    Salut, am nevoie de o solutie mai eleganta pt urmatoarea problema (eleganta - din punct de vedere al vitezei de executie). Am 2 tabele de genul:

    CREATE TABLE [dbo].[COMENZI](
    [ID] [decimal](18, 0) IDENTITY(1,1) NOT NULL,
    [ID_FURNIZOR] [decimal](18, 0) NULL,
    [SERVICIU] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [DATA1] [smalldatetime] NULL,
    [DATA2] [smalldatetime] NULL,
    ) ON [PRIMARY]

    CREATE TABLE [dbo].[PARTENERI](
    [ID] [decimal](18, 0) IDENTITY(1,1) NOT NULL,
    [NUME] [nvarchar](250) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [FIRMA] [nvarchar](70) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [LOCALITATEA] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    ) ON [PRIMARY]

    COMENZI INNER JOIN   dbo.PARTENERI ON dbo.COMENZI.ID_FURNIZOR = dbo.PARTENERI.ID
    Tabela PARTENERI contine numele firmelor partenere, iar tabela COMENZI contine f multe inregistrari (comenzi pt firme).

    Trebuie sa fac o procedura stocata care sa primeasca ca si parametrii de intrare 2 variabile de tip DATA sa zicem D1 si D2 si sa returneze o lista a tuturor firmelor care au comenzi in tabela COMENZI si care respecta conditia ca intersectia dintre intervalul D1 - D2 si DATA1 - DATA2 sa fie nenula. Deasemenea, am nevoie ca pt fiecare firma sa am si numarul de zile care reprezinta intersectia:

    FIRMA         NR_ZILE
    -----------------------------------
    Firma A            125
    Firma B              16 etc

    Sper ca am fost suficient de limpede in explicatie!

    Multumesc anticipat!

  •  01-09-2008, 12:46 AM 3744 in reply to 3743

    Re: Am nevoie de ajutor!

    Pp. ca DATA1 < DATA2 si @D1 < @D2 atunci conditiile pot fi formulate astfel:
    NEGATIE ( DATA1 < DATA2 < @D1 < @D2 )
    SAU
    NEGATIE ( @D1 < @D2 < DATA1 < DATA2 )
    iar in SQL:
    SELECT ...
    FROM ...
    WHERE NOT( DATA2 < @D1 OR @D2 < DATA1 )


  •  01-09-2008, 12:55 AM 3745 in reply to 3743

    Re: Am nevoie de ajutor!

    Pentru intervale "overlapping" poti incerca si ceva e genul:

    SELECT...FROM...JOIN...WHERE

    (@data1 BETWEEN DATA1 AND DATA2) OR (DATA1 BETWEEN @data1 AND @data2)

    @data1 si @data2 sunt parametrii procedurii.

    Testez maine...Smile

    Pe de alta parte poti folosi tipul de data int sau bigint pentru coloanele "ID"...

  •  01-09-2008, 1:01 AM 3746 in reply to 3745

    Re: Am nevoie de ajutor!

    ...iar pentru intersectia in zile poti folosi DATEDIFF cu argumentul datepart "day" - aici ai 4 cazuri, in functie de cum se situeaza parametrii fata de datele "fixe" (DATA1 si DATA2).

     

  •  01-09-2008, 1:03 AM 3747 in reply to 3744

    Re: Am nevoie de ajutor!

    Pp. ca aceasta conditie este indeplinita atunci pentru a calcula diferenta:
    [1] calculezi limita inferioara a intervalului comun cu @inf = MAXIM(DATA1 , @D1) ,
    [2] calculezi limita superioara a intervalului comun cu @sup = MINIM(DATA2 , @D2) ,
    [3] calculezi diferenta intre cele doua date calendaristice @inf si @sup.

    La [1] si [2] folosesti CASE ... END CASE la [3] folosesti DATEDIFF:

    SELECT ... DATEDIFF(
    dd,
    CASE DATA1>=@D1 THEN DATA1 ELSE @D1 END CASE,
    CASE DATA2<=@D2 THEN DATA2 ELSE @D2 END CASE
    ) AS NumarZileComune
    FROM ...
    WHERE
    NOT( DATA2 < @D1 OR @D2 < DATA1 )
  •  01-09-2008, 12:08 PM 3748 in reply to 3747

    Re: Am nevoie de ajutor!

  •  01-09-2008, 12:20 PM 3749 in reply to 3748

    Re: Am nevoie de ajutor!

    da, multumesc, am rezolvat pe baza informatiilor de la voi!
View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems