Announcement

Collapse
No announcement yet.

Wochenenden ermitteln

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

  • Wochenenden ermitteln

    Hallo Allerseits,

    Ich möchte gerne ermitteln, wie viel Wochenendtage (Samstag und Sonntag) ich in einen bestimmten Zeitraum habe... so in etwa... (vorsicht: Syntax nicht richtig!)

    SELECT Count(*) FROM Tabelle WHERE (Datename(dw, xxxx) = 'Samstag') and
    (Datename(dw, xxxx) = 'Sonntag') and (between Zeitraumanfang and Zeitraumende)

    so, könnte ich mir das vorstellen, jedoch fehlt mir das Argument bei der Funktion <Datename>

    mmmhhhhhhhhhhh

  • #2
    siehe Microsoft Hilfe

    Comment


    • #3
      Einen Zeitraum kann man für DATENAME nicht verwenden. Da wirst du wohl eine UserDefinedFunktion schreiben müssen, der du als Parameter Start- und Endedatum mitgibst und die dann mittels einer Schleife vom Startdatum bis zum Endedatum durchgeht(mit DATEADD) und als Ergebnis die Anzahl der Samstage zurückliefert.

      bye,
      Helmut

      Comment


      • #4
        SELECT Count(*) FROM Tabelle WHERE (Datename(dw, xxxx) = 'Samstag') and
        (Datename(dw, xxxx) = 'Sonntag') and (between Zeitraumanfang and Zeitraumende)
        a) sollte man lieber DATEPART verwenden, denn wenn die Language der DB nicht auf deutsch gesetzt ist, wird nicht 'Samstag' zurückgeliefert
        b) Ein Tag kann nicht 'Samstag' und zugleich 'Sonntag' sein

        [HIGHLIGHT="SQL"]WITH Data AS (
        SELECT CONVERT (DATETIME, '2011-07-01 00:00:00', 120) AS Datum UNION ALL
        SELECT CONVERT (DATETIME, '2011-07-02 00:00:00', 120) AS Datum UNION ALL
        SELECT CONVERT (DATETIME, '2011-07-03 00:00:00', 120) AS Datum UNION ALL
        SELECT CONVERT (DATETIME, '2011-07-04 00:00:00', 120) AS Datum UNION ALL
        SELECT CONVERT (DATETIME, '2011-07-05 00:00:00', 120) AS Datum UNION ALL
        SELECT CONVERT (DATETIME, '2011-07-06 00:00:00', 120) AS Datum UNION ALL
        SELECT CONVERT (DATETIME, '2011-07-07 00:00:00', 120) AS Datum UNION ALL
        SELECT CONVERT (DATETIME, '2011-07-08 00:00:00', 120) AS Datum UNION ALL
        SELECT CONVERT (DATETIME, '2011-07-09 00:00:00', 120) AS Datum UNION ALL
        SELECT CONVERT (DATETIME, '2011-07-10 00:00:00', 120) AS Datum UNION ALL
        SELECT CONVERT (DATETIME, '2011-07-11 00:00:00', 120) AS Datum UNION ALL
        SELECT CONVERT (DATETIME, '2011-07-12 00:00:00', 120) AS Datum UNION ALL
        SELECT CONVERT (DATETIME, '2011-07-13 00:00:00', 120) AS Datum UNION ALL
        SELECT CONVERT (DATETIME, '2011-07-14 00:00:00', 120) AS Datum UNION ALL
        SELECT CONVERT (DATETIME, '2011-07-15 00:00:00', 120) AS Datum UNION ALL
        SELECT CONVERT (DATETIME, '2011-07-16 00:00:00', 120) AS Datum UNION ALL
        SELECT CONVERT (DATETIME, '2011-07-17 00:00:00', 120) AS Datum UNION ALL
        SELECT CONVERT (DATETIME, '2011-07-18 00:00:00', 120) AS Datum UNION ALL
        SELECT CONVERT (DATETIME, '2011-07-19 00:00:00', 120) AS Datum UNION ALL
        SELECT CONVERT (DATETIME, '2011-07-20 00:00:00', 120) AS Datum UNION ALL
        SELECT CONVERT (DATETIME, '2011-07-21 00:00:00', 120) AS Datum UNION ALL
        SELECT CONVERT (DATETIME, '2011-07-22 00:00:00', 120) AS Datum UNION ALL
        SELECT CONVERT (DATETIME, '2011-07-23 00:00:00', 120) AS Datum UNION ALL
        SELECT CONVERT (DATETIME, '2011-07-24 00:00:00', 120) AS Datum UNION ALL
        SELECT CONVERT (DATETIME, '2011-07-25 00:00:00', 120) AS Datum UNION ALL
        SELECT CONVERT (DATETIME, '2011-07-26 00:00:00', 120) AS Datum UNION ALL
        SELECT CONVERT (DATETIME, '2011-07-27 00:00:00', 120) AS Datum UNION ALL
        SELECT CONVERT (DATETIME, '2011-07-28 00:00:00', 120) AS Datum UNION ALL
        SELECT CONVERT (DATETIME, '2011-07-29 00:00:00', 120) AS Datum UNION ALL
        SELECT CONVERT (DATETIME, '2011-07-30 00:00:00', 120) AS Datum UNION ALL
        SELECT CONVERT (DATETIME, '2011-07-31 00:00:00', 120) AS Datum
        )
        SELECT Count(*)
        FROM Data
        WHERE ( DatePart(dw, Datum) = 6
        or DatePart(dw, Datum) = 7)
        and Datum BETWEEN CONVERT (DATETIME, '2011-07-10 00:00:00', 120)
        AND CONVERT (DATETIME, '2011-07-20 00:00:00', 120)
        [/HIGHLIGHT]

        ergibt entsprechend 3

        PS: WITH ist hier nur dafür da, um eine virtuelle Tabelle zu erstellen...

        Comment


        • #5
          hwoess schrieb:

          Einen Zeitraum kann man für DATENAME nicht verwenden. Da wirst du wohl eine UserDefinedFunktion schreiben müssen, der du als Parameter Start- und Endedatum mitgibst und die dann mittels einer Schleife vom Startdatum bis zum Endedatum durchgeht(mit DATEADD) und als Ergebnis die Anzahl der Samstage zurückliefert.

          bye,
          Helmut


          Ja, ich habe genau diese Schleifenmethode angewendet. Leider hat dies ein wenig Zeit gebraucht (ca. 1:20 Stunden) ich musste die Werte wieder eine definierte Spalte schreiben lassen. Insgesamt das was für für mich nicht akzetabel war.. OK, es hat funktioniert, mann kann das über Nacht laufen lassen.. Es ist eben nur eine Notlösung..

          Comment


          • #6
            a) sollte man lieber DATEPART verwenden, denn wenn die Language der DB nicht auf deutsch gesetzt ist, wird nicht 'Samstag' zurückgeliefert
            Hallo Ebis,

            DATEPART ist aber auch nicht "regional-unabhängig", Zitat MSDN: "Der Rückgabewert hängt von der Sprachumgebung ab, "
            Es liefert Werte abhängig vom DATEFIRST Wert; in US beginnt die Woche am Samstag (=6), bei uns am Montag (=1):

            [highlight=SQL]
            SET DATEFIRST 1
            SELECT DatePart(dw, GetDate()) As Wochentag

            SET DATEFIRST 3
            SELECT DatePart(dw, GetDate()) As Wochentag

            SET DATEFIRST 6
            SELECT DatePart(dw, GetDate()) As Wochentag
            [/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


            • #7
              Also 1 Stunde 20 für was? Nur für das Zählen in einem bestimmten Zeitraum? Und wenn ja, wie oft gemacht ...
              Die schnellste Variante wäre zweifelsohne einfach mit DATEDIFF() die Anzahl der Tage zwischen 2 Datumswerten zu bestimmen und das durch 7 geteilt sollte in etwa die Anzahl der Samstage geben, wobei man sich das natürlich einmal genau überlegen muss, was passiert, wenn einer oder beide Datums auf einem Samstag liegen.

              bye,
              Helmut

              Comment


              • #8
                @Helmut,

                die Aufgabenstellung war doch wohl, die Anzahl der in der Datenbank vorhandenen Datumswerte, die auf Samstag oder Sonntag in einem Zeitraum fallen, zu bestimmen. Dabei hängt die Dauer der Abfrage ja auch erheblich von der Anzahl der Datensätze ab.
                Dein Vorschlag wäre für den Fall gut, dass man allgemein die Anzahl der Samstage und Sonntage zwischen zwei Datumswerten bestimmt. Aber dafür braucht man doch wohl keine Datenbank oder SQL.

                Gruß
                docendo discimus

                Comment


                • #9
                  Je öfter ich mir die Aufgabenstellung durchlese umso unklarer wird mir das Ganze.
                  Und die Frage lautet ja
                  Ich möchte gerne ermitteln, wie viel Wochenendtage (Samstag und Sonntag) ich in einen bestimmten Zeitraum habe...
                  Das bezieht sich nicht auf Datensätze und braucht daher eigentlich keine Datenbank und meine einfache Rechnung würde genügen

                  bye,
                  Helmut

                  Comment

                  Working...
                  X