Announcement

Collapse
No announcement yet.

Dateadd

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

  • Dateadd

    hallo miteinander,

    ich habe mal ne frage .. ich benutze folgendes querry um mir verschiedene dinge in einer tabelle anzuzeigen .. dabei will ich die "sendtime" eingrenzen .. so, dass mir nur tupels mit der aktuellen zeit minus eines bestimmten intervals angezeigten werden .. d.h. sendtime = now ..interval = 2 stunden .. dann solln mir alle tupels die kleiner als sendtime - 2 stunden angezeigt werden..
    jedoch gibt der mir da immer eine fehlermeldung zurück .. woran kann das liegen ? wieso funktioniert das über die funktionen nicht ? wieso muss ich das dateadd mit (day, -2 , sendtime ) angeben .. ? und nicht über datadd ( dbo.function........., dbo.function..... sendtime) einstellen ß

    hier der quellcode :

    SELECT [Index] AS [Workflow-Index],
    Sendtime AS [Send-Time],
    Param_Group AS [Param-Group],
    dbo.fn_brose_Parameter_changes_Monitoring_Paramete r_Group_Description(Param_Group) AS [Group-Description],
    dbo.fn_brose_Parameter_changes_Monitoring_Responsi ble_Mail_Address(Param_Group),
    dbo.fn_brose_Parameter_changes_Monitoring_Receiver _Mail_Address(Param_Group) AS [Receiver],
    dbo.fn_brose_Parameter_changes_Monitoring_Responsi ble_User(Param_Group) AS [Responsible],
    dbo.fn_brose_Parameter_changes_Monitoring_Responsi ble_User_Description(Param_Group) AS [Responsible_User_Description],
    dbo.fn_brose_Parameter_changes_Monitoring_Reminder _Interval(Param_Group) AS [Interval],
    dbo.fn_brose_Parameter_changes_Monitoring_Reminder _Interval_Unit(Param_Group) AS [Interval_Unit]
    FROM Parameter_changes_Monitoring_Workflow
    WHERE ( [SendTime] < (DATEADD (dbo.fn_brose_Parameter_changes_Monitoring_Reminde r_Interval_Unit(Param_Group),dbo.fn_brose_Paramete r_changes_Monitoring_Reminder_Interval(Param_Group ),Sendtime ) ) and (Comment is NULL))
    ORDER BY [Index] ;
    vielen dank für eure hilfe !

    danke !

  • #2
    Versuche mal etwas Ordnung in deine Frage zu bringen (oben redest du z.B. zuerst von Stunden, unten geht's wieder um Tage) und erschlage uns bitte nicht mit Monstertabellen/-spaltennamen. Für die Klärung deiner Frage probiere es doch einfach mal mit "select * from Parameter_changes_Monitoring_Workflow where sendtime > dateadd(day, -2 , getdate())" und dann erzähle uns, warum das Ergebnis nicht stimmt.

    bye,
    Helmut

    Comment


    • #3
      guten morgen,

      sorry für die umständliche frage ..
      ich will es mal genauer erklären..

      ich benutze folgendes statement um von dem aktuellen datum z.b. 2 tage abzuziehen ..
      select *from parameter_changes_Monitoring_Workflow where sendtime > dateadd (day,-2, getdate()) ... das funktioniert soweit auch .. jedoch möchte den datepart (day) und die time ( -2 ) dynamisch gestalten ... dass heißt.. er soll mir aus einer funktion, die ich geschrieben habe .. diese funktion aufrufen .. und mir den rückgabewert an der stelle in die funktion einsetzen .. das heißt .. dass die funktion in etwa so ausschauen sollte ..

      select * from parameter_changes_Monitoring_Workflow where sendtime > dateadd(select funktion1(übergabeparameter), select funktion2 (Übergabeparameter), getdate())

      leider funktioniert das nicht .. es kommt die fehlermeldung : Invalid parameter 1 specified for dateadd.

      kann mir jemand sagen, wie ich das dynamisch machen könnte ?

      die methode .. das ich zuerst 2 variablen deklariere .. und das dann in dem sinne so mache wie das nachfolgende beispiel möchte ich nicht .. da ich das komplette statement in ein dataset (delphi) schreibe und das dann nicht funktionieren würde !

      declare @interval as nvarchar(20)
      declare @interval_Unt as nvarchar(20)
      set @interval = (select Funktion1(Übergabeparameter))
      set @interval_unit = (Select funktion2(Übergabeparameter))

      select * from parameter-changes_Monitoring where sendtime < (Dateadd ( Interval_Unit, Interval, getdate())

      hat demzufolge jemand eine andere lösung, wie ich das machen könnte ?

      danke sehr !

      Comment


      • #4
        hej miteinander,

        ich habe es gerade auch mal im sql studio .. so probiert .. und selbst das funktioniert nicht .. woran kann das liegen :

        declare @interval as nvarchar(20)
        declare @interval_Unt as nvarchar(20)
        set @interval = (select Funktion1(Übergabeparameter))
        set @interval_unit = (Select funktion2(Übergabeparameter))

        select * from parameter-changes_Monitoring where sendtime < (Dateadd ( Interval_Unit, Interval, getdate())

        fehlermeldung : Invalid parameter 1 specified for dateadd.

        weiß jemand woran das liegt ?

        danke für eure hilfe !

        Comment


        • #5
          Das sagt doch schon die Fehlermeldung, der erste Parameter von DateAdd ist falsch.
          Es wird kein varchar Wert erwartet, sondern ein reserviertes Wort für den Interval, z.B.
          [highlight=SQL]SELECT Dateadd (month, ...[/highlight]
          Olaf Helper

          <Blog> <Xing>
          * cogito ergo sum * errare humanum est * quote erat demonstrandum *
          Wenn ich denke, ist das ein Fehler und das beweise ich täglich

          Comment


          • #6
            Das -wenn ich das richtig verstehe- variable/parametriserte Intervall könntest du über eine CASE Anweisung lösen:

            [highlight=sql]

            SELECT CASE @interval_unit
            WHEN 'm' THEN dateadd(month,@interval ,getdate())
            WHEN 'h' THEN dateadd(hour,@interval ,getdate())
            END AS Result

            [/highlight]

            Edit sagt:
            Noch eine Bitte bzw. ein Hinweis
            Unter Interpunktion (auch Zeichensetzung) versteht man das Setzen von Satzzeichen in Sätzen zur Verdeutlichung von syntaktischen Strukturen und das Setzen von Wortzeichen in Wörtern zur Verdeutlichung von morphologischen Strukturen. Sie folgt in jeder Sprache entsprechenden Interpunktionsregeln und ist Teil der Rechtschreibung.

            Nicht bös' gemeint, aber das erleichtert das Verstehen der Fragen doch erheblich und erhöht damit die Chance auf hilfreiche Antworten.

            Grüße
            Tino
            Zuletzt editiert von tinof; 21.09.2010, 13:19. Reason: Nachtrag
            Ich habs gleich!
            ... sagte der Programmierer.

            Comment


            • #7
              DateADD

              Servus miteinander,

              also ich habe das problem soweit mit der Case When anweisung gelöst.

              nun stehe ich vor einem anderen Problem... was aber auch damit zu tun hat.

              Hier erstmal das Statement :

              Code:
              DECLARE @Interval AS INT
              SET @interval = (dbo.fn_brose_Parameter_changes_Monitoring_Reminder_Interval(1))
              SET @interval = -@interval
              print @Interval
              SELECT  [Index] AS [Workflow-Index],  
                    Sendtime AS [Send-Time],  
                    Param_Group AS [Param-Group],  
                    dbo.fn_brose_Parameter_changes_Monitoring_Parameter_Group_Description(Param_Group) AS [Group-Description],  
                    dbo.fn_brose_Parameter_changes_Monitoring_Responsible_Mail_Address(Param_Group),
                    dbo.fn_brose_Parameter_changes_Monitoring_Receiver_Mail_Address(Param_Group) AS [Receiver],  
                    dbo.fn_brose_Parameter_changes_Monitoring_Responsible_User(Param_Group) AS [Responsible],  
                    dbo.fn_brose_Parameter_changes_Monitoring_Responsible_User_Description(Param_Group) AS [Responsible_User_Description], 
                    dbo.fn_brose_Parameter_changes_Monitoring_Reminder_Interval(Param_Group) AS [Interval] 
              FROM Parameter_changes_Monitoring_Workflow  
              WHERE  ([SendTime] < (case (select dbo.fn_brose_Parameter_changes_Monitoring_Reminder_Interval_Unit(Param_Group)) 
                          when 'ms' then (DATEADD (millisecond,Interval ,getdate() ))  
                          when 's' then (DATEADD (second, Interval,getdate() ))  
                          when 'n' then (DATEADD (minute, Interval,getdate() ))  
                          when 'h' then (DATEADD (hour, Interval,getdate() ))  
                          when 'd' then (DATEADD (day, Interval,getdate() ))  
                          when 'w' then (DATEADD (week, Interval,getdate() ))  
                          when 'm' then (DATEADD (month, Interval,getdate() ))  
                          when 'y' then (DATEADD (year, Interval,getdate() ))  
                      end   ))
              ORDER BY [Index]
              nun zu meinem Problem ... ich lese mit dem select befehl " Param_Group AS [Param-Group]" die Parametergruppe aus und verwende diese Param-Group in den darauffolgenden Select-Anweisungen. Mit der letzten select - anweisung lese ich das Interval aus (
              Code:
                    dbo.fn_brose_Parameter_changes_Monitoring_Reminder_Interval(Param_Group) AS [Interval]
              ) !

              dies würde ich gerne in der case when anweisung einbinden, d.h.
              dass das case-when statement dann folgendermaßen ausschaut
              -> (beispielhaft für Day:
              Code:
              when 'd' then (DATEADD (day, Interval,getdate() ))
              jedoch wird mir die fehlermeldung Invalid column name angezeigt ! das wiederrum heißt, dass eine spaltenbezeichnung .. in unserem fall "interval" falsch ist! woran kann das liegen ? wieso darf ich das so nicht machen ?

              hat jemand einen rat ?

              danke für eure hilfe !

              Comment


              • #8
                Code:
                when 'd' then (DATEADD (day, Interval,getdate() ))
                jedoch wird mir die fehlermeldung Invalid column name angezeigt ! das wiederrum heißt, dass eine spaltenbezeichnung .. in unserem fall "interval" falsch ist! woran kann das liegen ? wieso darf ich das so nicht machen ?

                hat jemand einen rat ?

                danke für eure hilfe !
                wenn mit Interval die Variable gemeint ist
                [HIGHLIGHT="SQL"]when 'd' then (DATEADD (day, @Interval,getdate() )) [/HIGHLIGHT]

                PS: Formatierung von SQL in Beiträgen

                Comment


                • #9
                  dateadd

                  danke erstmal für deine hilfe ! ...

                  mit @interval verwende ich die variable, die ich oben im quelltext deklariert und der ich einen wert zugewiesen habe ..

                  jedoch möchte ich aus dem select befehl heraus das interval auslesen ! das heißt, dass ich im letzten Select statement .. dies auslesen möchte und im case when statement verwenden möchte !

                  hier nochmal der farbige quelltext fürs bessere verständnis :
                  Code:
                  DECLARE @Interval AS INT
                  SET @interval = (dbo.fn_brose_Parameter_changes_Monitoring_Reminder_Interval(1))
                  SET @interval = -@interval
                  print @Interval
                  SELECT  [Index] AS [Workflow-Index],  
                        Sendtime AS [Send-Time],  
                        Param_Group AS [Param-Group],  
                        dbo.fn_brose_Parameter_changes_Monitoring_Parameter_Group_Description(Param_Group) AS [Group-Description],  
                        dbo.fn_brose_Parameter_changes_Monitoring_Responsible_Mail_Address(Param_Group),
                        dbo.fn_brose_Parameter_changes_Monitoring_Receiver_Mail_Address(Param_Group) AS [Receiver],  
                        dbo.fn_brose_Parameter_changes_Monitoring_Responsible_User(Param_Group) AS [Responsible],  
                        dbo.fn_brose_Parameter_changes_Monitoring_Responsible_User_Description(Param_Group) AS [Responsible_User_Description], 
                        dbo.fn_brose_Parameter_changes_Monitoring_Reminder_Interval(Param_Group) AS [Interval]  <-- hier lese ich das Interval aus !
                  FROM Parameter_changes_Monitoring_Workflow  
                  WHERE  ([SendTime] < (case (select dbo.fn_brose_Parameter_changes_Monitoring_Reminder_Interval_Unit(Param_Group)) 
                              when 'ms' then (DATEADD (millisecond,Interval ,getdate() ))  
                              when 's' then (DATEADD (second, Interval,getdate() ))  
                              when 'n' then (DATEADD (minute, Interval,getdate() ))  
                              when 'h' then (DATEADD (hour, Interval,getdate() ))  
                              when 'd' then (DATEADD (day, Interval,getdate() ))  
                              when 'w' then (DATEADD (week, Interval,getdate() ))  
                              when 'm' then (DATEADD (month, Interval,getdate() ))  
                              when 'y' then (DATEADD (year, Interval,getdate() ))  
                          end   ))
                  ORDER BY [Index]

                  jedoch klappt das leider nicht , so wie ich es mir wünsche ..

                  soweit verstanden ?

                  Comment


                  • #10
                    um evtl. das problem zu verdeutlichen :

                    wenn ich bei der case-when-anweisung das "Interval" durch Param_Group ersetze( die ich im übrigen auch durch den select befehl auslese!!!) .. funktioniert alles wunderbar ! setze ich das ganze zurück auf den ursprung, funktioniert es nicht .. wieso das ?

                    Code:
                    DECLARE @Interval AS INT
                    SET @interval = (dbo.fn_brose_Parameter_changes_Monitoring_Reminder_Interval(1))
                    SET @interval = -@interval
                    print @Interval
                    SELECT  [Index] AS [Workflow-Index],  
                          Sendtime AS [Send-Time],  
                          Param_Group AS [Param-Group],  
                          dbo.fn_brose_Parameter_changes_Monitoring_Parameter_Group_Description(Param_Group) AS [Group-Description],  
                          dbo.fn_brose_Parameter_changes_Monitoring_Responsible_Mail_Address(Param_Group),
                          dbo.fn_brose_Parameter_changes_Monitoring_Receiver_Mail_Address(Param_Group) AS [Receiver],  
                          dbo.fn_brose_Parameter_changes_Monitoring_Responsible_User(Param_Group) AS [Responsible],  
                          dbo.fn_brose_Parameter_changes_Monitoring_Responsible_User_Description(Param_Group) AS [Responsible_User_Description], 
                          dbo.fn_brose_Parameter_changes_Monitoring_Reminder_Interval(Param_Group) AS [Interval]  <-- hier lese ich das Interval aus !
                    FROM Parameter_changes_Monitoring_Workflow  
                    WHERE  ([SendTime] < (case (select dbo.fn_brose_Parameter_changes_Monitoring_Reminder_Interval_Unit(Param_Group)) 
                                when 'ms' then (DATEADD (millisecond,Interval ,getdate() ))  
                                when 's' then (DATEADD (second, Interval,getdate() ))  
                                when 'n' then (DATEADD (minute, Interval,getdate() ))  
                                when 'h' then (DATEADD (hour, Interval,getdate() ))  
                                when 'd' then (DATEADD (day, Param_Group,getdate() ))  
                                when 'w' then (DATEADD (week, Interval,getdate() ))  
                                when 'm' then (DATEADD (month, Interval,getdate() ))  
                                when 'y' then (DATEADD (year, Interval,getdate() ))  
                            end   ))
                    ORDER BY [Index]

                    Comment


                    • #11
                      wenn ich mir das ganze so anschaue, wäre es ja logisch , wenn ich nicht "interval" in die case-when-anweisung schreibe sondern ... dbo.fn_brose_Parameter_changes_Monitoring_Reminder _Interval(Param_Group)

                      aber leider funktioniert dies auch nicht ...

                      Code:
                      DECLARE @Interval AS INT
                      SET @interval = (dbo.fn_brose_Parameter_changes_Monitoring_Reminder_Interval(1))
                      SET @interval = -@interval
                      print @Interval
                      SELECT  [Index] AS [Workflow-Index],  
                            Sendtime AS [Send-Time],  
                            Param_Group AS [Param-Group],  
                            dbo.fn_brose_Parameter_changes_Monitoring_Parameter_Group_Description(Param_Group) AS [Group-Description],  
                            dbo.fn_brose_Parameter_changes_Monitoring_Responsible_Mail_Address(Param_Group),
                            dbo.fn_brose_Parameter_changes_Monitoring_Receiver_Mail_Address(Param_Group) AS [Receiver],  
                            dbo.fn_brose_Parameter_changes_Monitoring_Responsible_User(Param_Group) AS [Responsible],  
                            dbo.fn_brose_Parameter_changes_Monitoring_Responsible_User_Description(Param_Group) AS [Responsible_User_Description], 
                            dbo.fn_brose_Parameter_changes_Monitoring_Reminder_Interval(Param_Group) AS [Interval]  <-- hier lese ich das Interval aus !
                      FROM Parameter_changes_Monitoring_Workflow  
                      WHERE  ([SendTime] < (case (select dbo.fn_brose_Parameter_changes_Monitoring_Reminder_Interval_Unit(Param_Group)) 
                                  when 'ms' then (DATEADD (millisecond,Interval ,getdate() ))  
                                  when 's' then (DATEADD (second, Interval,getdate() ))  
                                  when 'n' then (DATEADD (minute, Interval,getdate() ))  
                                  when 'h' then (DATEADD (hour, Interval,getdate() ))  
                                  when 'd' then (DATEADD (day,  dbo.fn_brose_Parameter_changes_Monitoring_Reminder_Interval(Param_Group),getdate() ))  
                                  when 'w' then (DATEADD (week, Interval,getdate() ))  
                                  when 'm' then (DATEADD (month, Interval,getdate() ))  
                                  when 'y' then (DATEADD (year, Interval,getdate() ))  
                              end   ))
                      ORDER BY [Index]
                      Fehlermeldung : Argument data type nvarchar is invalid for argument 2 of dateadd function.

                      Comment


                      • #12
                        hallo miteinander,

                        so wie der letzte quelltext ist, ist es richtig !

                        jedoch war mein fehler, dass ich in der fkt. , die ich aufgerufen habe, ein fehler war. deswegen kam nie das richtige ergebnis heraus !

                        trotzdem danke für die hilfestellung

                        Comment

                        Working...
                        X