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

Update Set If Else ???

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von cjoksch, 26 Juli 2013.

  1. cjoksch

    cjoksch Benutzer

    Hallo,
    habe ein kleines Problem und neu in der Materie.
    Ich habe 2 Tabellen
    T1:
    Name
    Von
    Bis
    Bit-Feld

    T2
    Name
    Von
    Bis

    Nun möchte ich folgendes machen.
    Setze mir das Bit-Feld auf "1" wenn Getdate() between T1.Von und T1.Bis und falls Name von T1 in T2 und Getdate() nicht zwischen t2.Von und T2.bis ansonsten setze mir das Bit-Feld auf "0"

    Ich hoffe ich habe mich verständlich ausgedrückt.

    grüße

    cay
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Nein. Zeig ein Beispiel. Was steht in den Tabellen, was soll passieren. Nutze die in Foren üblichen Formatierungsmöglichkeiten für Code-Blöcke.
     
  3. cjoksch

    cjoksch Benutzer

    Hallo,
    habe ich mir gedacht :)
    Code:
    CREATE TABLE datum
    (
        ID UNIQUEIDENTIFIER,
        NAME VARCHAR(128) NOT NULL,
        Von DATE NOT NULL,
        Bis DATE NOT NULL,
        Ja Bit 
    )
     
    CREATE TABLE Timestop
    (
        ID UNIQUEIDENTIFIER,
        NAME2 VARCHAR(128) NOT NULL,
        Von DATE NOT NULL,
        Bis DATE NOT NULL
    )
    Nun möchte ich :
    wenn das heutige Datum zwischen datum.von und datum.bis und wenn der Name aus Datum in Timestop vorkommt soll geprüft werden ob das heutige Datum nicht zischen Timestop.von und Timestop.bis liegt soll das Bit bei Datum.ja auf 1 gesetzt wird ansonsten auf 0

    grüße

    cay
     
  4. akretschmer

    akretschmer Datenbank-Guru


    Das ist schon mal ein anderes Design als erst, jetzt hast Du ja einen Primary Key. Kommen alle Namen von t1 auch in t2 vor? Was, wenn nicht?

    Als Ansatz:

    Code:
    test=*# select * from t1;
     name  |    von     |    bis     | b
    -------+------------+------------+---
     hans  | 2013-01-01 | 2013-02-01 |
     peter | 2013-07-01 | 2013-08-01 |
     jens  | 2013-07-01 | 2013-08-01 |
     lisa  | 2013-07-01 | 2013-08-01 |
    (4 rows)
    
    Time: 0,202 ms
    test=*# select * from t2;
     name  |    von     |    bis
    -------+------------+------------
     peter | 2013-07-01 | 2013-08-01
     jens  | 2013-07-01 | 2013-08-01
     lisa  | 2013-05-01 | 2013-05-01
    (3 rows)
    
    Time: 0,120 ms
    test=*# update t1 set b = true from  t2 where t1.name=t2.name and current_date between t1.von and t1.bis and current_date not between t2.von and t2.bis;
    UPDATE 1
    Time: 0,426 ms
    test=*# select * from t1;
     name  |    von     |    bis     | b
    -------+------------+------------+---
     hans  | 2013-01-01 | 2013-02-01 |
     peter | 2013-07-01 | 2013-08-01 |
     jens  | 2013-07-01 | 2013-08-01 |
     lisa  | 2013-07-01 | 2013-08-01 | t
    (4 rows)
    
    Time: 0,197 ms
    
    Andreas
     
  5. cjoksch

    cjoksch Benutzer

    Hallo,
    super und danke, also wenn der Name nicht in t2 ist dann soll nur t1 berücksichtigt werden.

    grüße

    cay
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Dann also etwas wie

    Code:
    test=# select * from t1;
     name  |    von     |    bis     | b
    -------+------------+------------+---
     hans  | 2013-01-01 | 2013-02-01 |
     peter | 2013-07-01 | 2013-08-01 |
     jens  | 2013-07-01 | 2013-08-01 |
     lisa  | 2013-07-01 | 2013-08-01 |
     max   | 2013-07-01 | 2013-08-01 |
    (5 rows)
    
    Time: 0,186 ms
    test=*# select * from t2;
     name  |    von     |    bis
    -------+------------+------------
     peter | 2013-07-01 | 2013-08-01
     jens  | 2013-07-01 | 2013-08-01
     lisa  | 2013-05-01 | 2013-05-01
    (3 rows)
    
    Time: 0,181 ms
    test=*# update t1 set b = true from  t2 where (t1.name=t2.name and current_date between t1.von and t1.bis and current_date not between t2.von and t2.bis) or (t1.name not in (select name from t2) and current_date between t1.von and t1.bis);
    UPDATE 2
    Time: 0,594 ms
    test=*# select * from t1;
     name  |    von     |    bis     | b
    -------+------------+------------+---
     hans  | 2013-01-01 | 2013-02-01 |
     peter | 2013-07-01 | 2013-08-01 |
     jens  | 2013-07-01 | 2013-08-01 |
     max   | 2013-07-01 | 2013-08-01 | t
     lisa  | 2013-07-01 | 2013-08-01 | t
    (5 rows)
    
    Teste & prüfe es, bevor Du Dich darauf verläßt ... und ja, wie immer bei mir: ist mit PostgreSQL gemacht, aber einklich Standard-SQL ohne extra Features wie Range-Typen oder so ;-)
     
  7. cjoksch

    cjoksch Benutzer

    Hallo,
    sehr vielen dank funktioniert super, wobei dein current-date in Getdate() getauscht werden muss.
    Aber sonst super und danke

    grüße

    cay
     
    akretschmer gefällt das.
  8. akretschmer

    akretschmer Datenbank-Guru

    Na fein, wenn es geholfen hat.
     
    cjoksch gefällt das.
  9. cjoksch

    cjoksch Benutzer

    Hallo,
    noch eine frage
    Wie bekomme ich dieses Update in eine Prozedure ??

    grüße

    Cay
     
  10. akretschmer

    akretschmer Datenbank-Guru

    Das müßte mal jemand erklären, der von M$SQL mehr Ahnung hat als ich. Ich könnte es Dir max. für PostgreSQL zeigen, hilft Dir aber nix.
     
  11. cjoksch

    cjoksch Benutzer

    okay danke
     
  12. ukulele

    ukulele Datenbank-Guru

    Eigentlich macht dein Bitfeld gar keinen Sinn das müsste ja jeden Tag aktuallisiert werden. Warum baust du dir dein Kriterium in die WHERE Bedingung deines Selects oder baust dir eine Sicht die das ganze umsetzt?
     
    akretschmer gefällt das.
  13. akretschmer

    akretschmer Datenbank-Guru

    Berechtigter Einwand!
     
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