Update Set If Else ???

cjoksch

Benutzer
Beiträge
6
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
 
Werbung:

cjoksch

Benutzer
Beiträge
6
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
 

akretschmer

Datenbank-Guru
Beiträge
9.612
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


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
 

akretschmer

Datenbank-Guru
Beiträge
9.612
Hallo,
super und danke, also wenn der Name nicht in t2 ist dann soll nur t1 berücksichtigt werden.

grüße

cay

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 ;-)
 

ukulele

Datenbank-Guru
Beiträge
4.690
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?
 
Werbung:
Oben