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

Projekt Wochentag berechnen

Dieses Thema im Forum "PostgreSQL" wurde erstellt von Kampfgummibaerlie, 19 Mai 2017.

  1. Kampfgummibaerlie

    Kampfgummibaerlie Datenbank-Guru

    Nachdem ich nach einer Weile im Internet suchen offenbar keine "eingebaute" Funkton finde, welche einem erlaubt, aus dem Datum den Wochentag zu wählen (DoW und andere haben bei mir nicht funktioniert...)

    Daher möchte ich mir das Ganze selbst erstellen, indem ich:
    1.: Gerne einen Typen erstellen würde, welcher eine Range zwischen 2 Daten darstellt.
    2.: Gerne eine Function (1) erstellen würde, welche den Restwert einer Division angibt (Modularwert, oder so)
    3.: Gerne eine Function (2) erstellen würde, welche eben auf die Function (1) zugreift, und mir den "Restwert" (ich definiere im Modularwert natürlich 7 als Divident), und der Wert, welcher (entsprechend durch 7) dividiert wird, sollte das Ergebniss den entsprechenden "Wochentag" darstellen.

    Der Syntax für das Berechnen des Modularwertes:
    Code:
    select MOD(15, 4)
    
    Ergebniss sollte bei jedem 3 sein ^^

    Mein Gedanke:
    Es ist relativ egal, welche Zahl man durch 7 dividiert, es gehen sich immer 1, 2, 3, 4, 5 oder 6 mit dem selben Restwert, der auch bei 8 bis 13 rauskommt, und ich würde gerne entsprechend den Wochentag (1-7) berechnen, nach dem entsprechendem Restwert, welcher durch 7 dividiert wird und aus der Function(1) kommt, und entsprechend die Werte definierbaren Tagen zuordnen.

    Ein Beispiel für meinen Denkweg:
    So, wie ein jedes Schaltjahr den Modularwert 0 hat, wenn 4 der Divident ist, und die entsprechenden weiteren Jahre alle den selben Modularwert haben (je nachdem, obs das 1., 2. oder 3. Jahr nach einem Schaltjahr ist) einen Restwert, der aber für das 1., 2. und 3. Jahr gleich bleibt, zu jedem Schaltjahr ist er natürlich 0 ;)

    Diese Logik möchte ich auf die Berechnung des Wochentags ändern:
    So, wie ein jede Woche einen Modularwert von 0 hat, wenn die Woche abgeschlossen ist, steigert sich das multiplikativ, sprich ein jeder Montag (1/7) hätte den Modularwert 0,142857..... 2/7 hätte genau das doppelte, und so weiter.

    Auf diesem Weg würde ich gerne (wenns sein muss auch durch mehrere Abfragen(?)) individuell so machen.

    Abgesehen von des Nutzen von soetwas, sehe ich darin auch viele "XP-Points" in Postgresql ;)

    Wie immer, bin ich natürlich bei jeder Unterstützung froh darüber ;)

    Werde mich natürlch auch selbst dahintersetzen, und ein wenig versuchen, weiterzukommen, aber ja, bin halt noch nicht so ein Ass, wie andere ^^
     
  2. Kampfgummibaerlie

    Kampfgummibaerlie Datenbank-Guru

    K, nach ein wenig Erfahrung sammeln, kam ich drauf, dass der Mod-Wert keine 0,x Werte sind, sondern ganze Zahlen ;)

    Sprich:
    create Function:
    Code:
    create function Restwert (x numeric, y numeric) RETURNS numeric AS 'SELECT ((Mod(x, y)))' Language sql strict immutable
    
    select Function:
    Code:
    select restwert(8, 7);
    
    Ergebniss ist 1 ;)
     
  3. akretschmer

    akretschmer Datenbank-Guru

    Code:
    select extract(dow from current_date);
    
    Sonntag ist 0, Montag 1, ..., Freitag 5.
     
  4. Kampfgummibaerlie

    Kampfgummibaerlie Datenbank-Guru

    Wie mache ich das select in eine Function?

    Habe folgenden probiert:
    Code:
    CREATE FUNCTION wochentag_datum (x numeric) RETURNS numeric AS 'select extract(dow from current_date)' LANGUAGE sql STRICT IMMUTABLE;
    
    Fehlermeldung:
    FEHLER: Rückgabetyp von Funktion stimmt nicht überein; deklariert als numeric DETAIL: Eigentlicher Rückgabetyp ist double precision. CONTEXT: SQL-Funktion »wochentag_datum« ********** Error ********** FEHLER: Rückgabetyp von Funktion stimmt nicht überein; deklariert als numeric SQL-Status: 42P13 Detail: Eigentlicher Rückgabetyp ist double precision. Kontext: SQL-Funktion »wochentag_datum«

    und ich glaube, den Fehler hatte ich schon einmal, aber ja... :/
    tut mir ehrlich leid, dass ich so spät noch "störe" xD
     
  5. Kampfgummibaerlie

    Kampfgummibaerlie Datenbank-Guru

    Ich glaube, ich kam dahinter -.-

    Habe die ganze Zeit probiert, den Typ als den entsprechenden double precision zu definieren, indem ich den Namen mit Abstand dazwischen, bzw. auch mit einem '_' dazwischen schreibe.

    Kaum googlet man, entdeckt man, dass nicht alles, was er schreibt, dass es sein sollte, auch 1:1 so vom Programm verstanden wird.
    float8 ist double precision

    create:

    Code:
    CREATE FUNCTION DOW (x date) RETURNS float8 AS 'select extract(dow from x)' LANGUAGE sql STRICT IMMUTABLE;
    
    select:

    Code:
    select DOW('19.5.17')
    
    Ergebniss:

    Code:
    5
    
    Bin heilfroh, dass ich jetzt dann gut schlafen werde xD

    Kommentar dazu:
    Das funktioniert nach unserem System, heute ist der 5. Wochentag, und ja, heute ist (noch) der 19.5.2017 ;)
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Ich glaube, Du machst es Dir unnötig schwer. Man muß nicht für jeden Pups eine eigene Funktion schreiben. Aber egal.

    Code:
    test=*# CREATE FUNCTION wochentag_datum (x date) RETURNS double precision AS 'select extract(dow from x)' LANGUAGE sql STRICT IMMUTABLE;
    CREATE FUNCTION
    test=*# select wochentag_datum(current_date);
     wochentag_datum
    -----------------
      5
    (1 Zeile)
    
     
  7. Kampfgummibaerlie

    Kampfgummibaerlie Datenbank-Guru

    Wegen jedem Pups, mag sein, ich weiß mir nicht anders zu helfen ;)

    Würde die Datenbank gerne mehr automatisieren, als mechanisch bedienbar machen.

    Das wars für heute bei mir ;D

    Wünsche euch eine gute Nacht :)
     
  8. akretschmer

    akretschmer Datenbank-Guru

    Nun ja, Du gewinnst halt maximal 'ne goldene Posteblume, wenn Du einen einzelnen Funktionsaufruf wieder in eine Funktion kapselst. Das kannst Du episch lange wiederholen - der Gewinn wird dabei aber nicht größer.
     
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