Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Rückgabe Erster/Letzter Tag (Datum) einer vorgegebenen Woche

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von funkyice, 17 Februar 2014.

  1. funkyice

    funkyice Benutzer

    Hallo zusammen,

    ich würde gern aus einer eingegebenen Kalenderwoche automatisch das Datum des ersten (Montag) und letzten Wochentages (Sonntag) ermitteln lassen.
    Folgendes funktioniert mit der Abfrage eines Datums, weiß aber nicht, wie man das umbauen muss, damit es auch mit der Angabe einer Kalenderwoche funktioniert.
    Code:
        DATEADD(WW, DATEDIFF(WW,0,@DatumX),0),     --first day week
        DATEADD(WW,DATEDIFF(WW,0,@DatumX)+1,0)-1,  --last day week
    Ich möchte beim Benutzer also die Kalenderwoche abfragen, z.B. 7 und erhalte dann:
    10.02.2014 und 16.02.2014

    Danke für Eure Hilfe,
    Sebastian
     
  2. ukulele

    ukulele Datenbank-Guru

    Code:
    SELECT    datepart(ww,@DatumX)
    Wird dir die Kalenderwoche liefern. Ist es das, was du suchst?
     
  3. funkyice

    funkyice Benutzer

    Das wäre einfach. Das suche ich leider nicht, sondern genau anders rum! ;-)

    Der Benutzer gibt die Kalenderwoche vor und die Funktion generiert mir das erste und letzte Datum der Woche.
     
  4. ukulele

    ukulele Datenbank-Guru

    Irgendwie so:
    Code:
    DECLARE    @jahr SMALLINT,
            @woche INT
    
    SET        @jahr = 2014
    SET        @woche = 1
    
    SELECT    datepart(ww,getdate())
    SELECT    cast(cast(@jahr AS CHAR(4)) + '-01-01 00:00:00.000' AS DATETIME) +
            datepart(dw,cast(@jahr AS CHAR(4)) + '-01-01 00:00:00.000')+@woche*7 AS Wochenanfang,
            cast(cast(@jahr AS CHAR(4)) + '-01-01 00:00:00.000' AS DATETIME) +
            datepart(dw,cast(@jahr AS CHAR(4)) + '-01-01 00:00:00.000')+@woche*7+7 AS Wochenende
     
  5. funkyice

    funkyice Benutzer

    Das schaut schon nicht so schlecht aus, bei mir errechnet sich die Woche dann allerdings immer von Samstag bis Samstag.
    Bei Deinem Beispiel kommt z.B. raus:
    Wochenanfang: 11.1..2014
    Wochenende: 18.11.2014

    Haut also noch nicht ganz hin.
     
  6. ukulele

    ukulele Datenbank-Guru

    Na dann rechnest du halt noch Datum +1 was einen Tag dazu zuählt, das schaffst du ;)

    Du ungültige Eingaben musst du noch Filtern bzw. den 31.12. als max Datum setzen.
     
  7. funkyice

    funkyice Benutzer

    Er gibt leider auch die falsche Kalenderwoche zurück, es ist nicht nur der eine Tag. Leider komme ich nicht dahinter, wie ich ersteres beeinflussen kann.
    Wie setzt man den 31.12. als MAX Datum?
     
  8. akretschmer

    akretschmer Datenbank-Guru

    Gibt es da keiner fertige Funktion für?

    In PG gibt es to_date() für sowas:



    Code:
    test=*# select to_date('8-2014-1', 'IW-IYYY-ID');
      to_date
    ------------
     2014-02-17
    (1 row)
    
    IW: Iso-Week
    IYYYY: Iso-Jahr
    ID: ISO day of the week, Monday(1) to Sunday(7)

    http://www.postgresql.org/docs/9.3/interactive/functions-formatting.html


    Ist aber PostgreSQL, M$SQL kenne/nutze ich nicht.
     
  9. ukulele

    ukulele Datenbank-Guru

    Ne ich glaube nicht. Habe beim Googeln nur komplizierte Funktionen gefunden.

    Ich habs mal etwas aufgebohrt, kann sein das es einfacher geht oder noch ein Bug drin steckt:
    Code:
    DECLARE    @jahr SMALLINT,
            @woche INT,
            @datumMIN DATETIME,
            @datumMAX DATETIME
    
    SET        @jahr = 2013
    SET        @woche = 53
    
    SET        @datumMIN = cast(cast(@jahr AS CHAR(4)) + '-01-01 00:00:00.000' AS DATETIME)
    SET        @datumMAX = cast(cast(@jahr AS CHAR(4)) + '-31-12 00:00:00.000' AS DATETIME)
    
    SELECT    (    CASE
                WHEN    @woche <= 1
                THEN    @datumMIN
                WHEN    @datumMIN + 8 - datepart(dw,@datumMIN) + ( @woche - 2 )* 7 > @datumMAX
                THEN    @datumMAX
                ELSE    @datumMIN + 8 - datepart(dw,@datumMIN) + ( @woche - 2 )* 7
                END ) AS Wochenanfang,
            (    CASE
                WHEN    @datumMIN + 8 - datepart(dw,@datumMIN) + ( @woche - 2 )* 7 + 6 > @datumMAX
                THEN    @datumMAX
                ELSE    @datumMIN + 8 - datepart(dw,@datumMIN) + ( @woche - 2 )* 7 + 6
                END ) AS Wochenende
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden