Announcement

Collapse
No announcement yet.

ein paar fragen(getdate; prozedure, etc)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • ein paar fragen(getdate; prozedure, etc)

    Hallo,

    eins vorweg ich hab nicht wirklich ahnung von MSSQL das was ihr hier gleich sehen werden war meistens copy&paste geflicke..

    Wir fahren täglich reporte aus einer MSSQL-DB und das immer vom Tag davor und jewals zwischen einer bestimmten Zeit, jedoch ist das recht langsam (wegen dem convert?) und man hat mir gesagt das sowas mit einer Prozedur einfacher gehen würde, ich hab jetzt etwas gegoogelt und nicht wirklich irgendwas verstanden.. und nun hoffe ich das ihr mir dabei weiter helfen könnt

    hier mal das was ich so fabriziert habe
    Code:
    "IWrkgrpQueueStats"."dIntervalStart" BETWEEN CONVERT(datetime,(CONVERT(VARCHAR(10),GETDATE() -1,121) + ' 00:00:00:000'), 121) 
    AND CONVERT(datetime,(CONVERT(VARCHAR(10),GETDATE() -1,121) + ' 23:59:59:000'), 121)
    die Performance ist zwar nicht so prall aber es geht erstmal, aber mein grösseres Problem ist das ich jetzt bei den Monatsreports einen Monat zurück gehen muss und da die Monate ja nie gleich lang sind geht das leider etwas schwer. Hat dort jmd eine idee für mich wie ich das hinbekommen kann??

    schonmal besten dank im voraus!!
    Gruss

    Edit: der Datentyp ist 'datetime'

  • #2
    Originally posted by Colttt View Post
    Wir fahren täglich reporte aus einer MSSQL-DB und das immer vom Tag davor und jewals zwischen einer bestimmten Zeit, jedoch ist das recht langsam (wegen dem convert?) und man hat mir gesagt das sowas mit einer Prozedur einfacher gehen würde, ich hab jetzt etwas gegoogelt und nicht wirklich irgendwas verstanden.. und nun hoffe ich das ihr mir dabei weiter helfen könnt
    Wegen dem Convert werden Indexe, sofern auf Spalte "IWrkgrpQueueStats.dIntervalStart" vorhanden, erst mal nicht benutzt...

    In einer Sp kanns du Variablen setzen
    [HIGHLIGHT="SQL"]
    DECLARE @Start DATETIME; SET @Start = CONVERT(datetime,(CONVERT(VARCHAR(10),GETDATE() -1,121) + ' 00:00:00:000'), 121);
    DECLARE @End DATETIME; SET @End = CONVERT(datetime,(CONVERT(VARCHAR(10),GETDATE() -1,121) + ' 23:59:59:000'), 121);

    ....
    IWrkgrpQueueStats.dIntervalStart BETWEEN @Start AND @End [/HIGHLIGHT]

    Comment


    • #3
      ok besten dank..aber is das jetzt nicht das selbe? bis auf das ich eine Variable deklariert habe??

      Comment


      • #4
        Originally posted by Colttt View Post

        aber mein grösseres Problem ist das ich jetzt bei den Monatsreports einen Monat zurück gehen muss und da die Monate ja nie gleich lang sind geht das leider etwas schwer. Hat dort jmd eine idee für mich wie ich das hinbekommen kann??

        schonmal besten dank im voraus!!
        Gruss

        Edit: der Datentyp ist 'datetime'
        Ich habe 2 Funktionen die mir den ersten Tag des Monats und den letzten zurück liefern. Einfach mit einem Datum des Monats den du auswerten möchtest aufrufen.

        z.B:
        DECLARE @datumstart datetime
        SET @datumstart = [dbo].[anfang_aktueller_Monat]('28.04.2010')

        und @datumstart dann in deiner SP verwenden....


        Code:
        CREATE FUNCTION [dbo].[anfang_aktueller_Monat] (
          @d1  datetime
        ) RETURNS varchar(30) AS
        --
        BEGIN
        declare @d2 varchar(30)
        
        SET @d2 = CAST('01.' + STR(MONTH(@d1)) + '.' + STR(YEAR(@d1)) + ' 00:00' AS DateTime) --erster des aktuellen Monats
        
        
        Return @d2
        --
        END
        
        GO
        
        
        
        
        
        CREATE FUNCTION [dbo].[ende_aktueller_Monat] (
          @d1  datetime
        ) RETURNS varchar(30) AS
        --
        BEGIN
        declare @d2 varchar(30)
        
        SET @d2 = dateadd(mm,1, CAST('01.' + STR(MONTH(@d1)) + '.' + STR(YEAR(@d1)) AS DateTime)) --erster des Folgemonats
        SET @d2 = dateadd(ss,-1,@d2) --letzter des übergebenen Monats
        
        Return @d2
        --
        END
        
        
        GO

        Comment


        • #5
          Originally posted by Colttt View Post
          ok besten dank..aber is das jetzt nicht das selbe? bis auf das ich eine Variable deklariert habe??
          probiers aus und lass dir die Abfragepläne anzeigen...

          Comment


          • #6
            Hallo und Sorry das ich mich jetzt erst wieder melde..

            @ebis: danke es läuft somit schneller (gefühlt) weiss zwar nicht was du mit Abfragepläne meinst, da ich bei den Reporten mit Pentaho arbeite aber passt schon

            @openshinok: danke ich hab nach einer weile suchen noch was anderes gefunden was auch prima klappt: Quelle
            Code:
            DECLARE @Monatende DATETIME; SET @Monatende = DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0))
            DECLARE @Monatstart DATETIME; SET @Monatstart = DATEADD(s,0,DATEADD(mm, DATEDIFF(m,0,getdate())-1,0))
            ähm wie kann ich bei dem Monatsdingens es jetzt noch so einstellen, das er mir bestimmte Uhrzeiten anzeigt, also bsp von 01.04-30.04 von 8-16Uhr

            Comment


            • #7
              hallo,
              meinst du 01.04.2010 8:00:00
              bis
              30.04.2010 16:00:00

              Oder an allen Tagen von 01.04.2010 bis 30.04.2010 immer nur die Zeiten von 8 bis 16 Uhr?

              Comment


              • #8
                hallo,
                ich meine an allen tagen 8-16Uhr

                Comment


                • #9
                  hallo,
                  http://www.spotlight-wissen.de/archi...e/1614628.html

                  Unterschied:
                  00:00:00 durch 08:00:00 ersetzen
                  sowie 23:59:59 durch 16:00:00

                  und dann die Tabellenwertfunktion mit deiner eigentlichen Abfrage kombinieren.... am besten über ein entsprechendes Join...


                  edit: upsi Beispiel ist mit Monaten, musst du halt für Tage umschreiben...
                  Zuletzt editiert von openshinok; 03.05.2010, 13:37. Reason: was vergessen

                  Comment


                  • #10
                    hmm..

                    geht bei mir nicht.. stell mich wahrscheinlich zu dämlich an, oder ich stell mir das zu einfach an

                    Comment


                    • #11
                      Originally posted by Colttt View Post
                      hmm..

                      geht bei mir nicht.. stell mich wahrscheinlich zu dämlich an, oder ich stell mir das zu einfach an
                      und was geht nicht...

                      Comment


                      • #12
                        hehe alles

                        ich hab jetzt versucht aus meinem ersten post das zu machen, da ich denke das es irgendwie mit convert geht,aber geht nicht, so sieht das konstrukt aus

                        Code:
                        convert(datetime,(convert(VARCHAR(10),DATEADD(s,0,DATEADD(mm, DATEDIFF(m,0,getdate())-1,121)) + ' 08:00:00:000'),121))
                        aber das sagt er das was bei ',' nicht stimmt..

                        könnte mir dort evtl jmd die lösung vorkauen?
                        möchte "einfach" nur den vorherigen monat habn(erledigt) und dann an allen tagen zwischen 8-16Uhr..

                        Comment


                        • #13
                          Dann solltest du Die Where-bedingung anpassen:

                          AND DATEPART (Hour, Deine_DatumsSpalte) > 8
                          AND DATEPART (Hour, Deine_DatumsSpalte) < 16

                          Comment


                          • #14
                            ohh man.. na klar warum bin i nicht selbst drauf kommen^^

                            besten dank dafür!!

                            Comment

                            Working...
                            X