# Wochentage und Zeiträume in Datenbank ablegen



## TutorialKing (1. Juli 2008)

Hallo zusammen,

ich habe eine Tabelle Bestellungen, in dieser möchte ich Zeiträume und die dazugehörigen Wochentage ablegen. Was wäre hier performance technisch am besten ?

Den Zeitraum decke ich einfach ab:
Tabelle :Bestellungen
von (Date) z.b. 01.06.2008
bis (Date) z.b. 01.08.2012

In diesem Zeitraum möchte ich jetzt jeden mo, mi, und fr. noch zusätzlich speichern.
Hier habe ich verschiedene Ansätze :

1.
Entweder 7 Spalten von Mo.-So. und diese dann Int 1 oder 0 bzw. true and false.

2.varchar Feld (1,0,1,0,1,0,0) Mo,Di,Mi,Do,Fr,Sa,So

3.int Feld (1010100) mit führendem Dummy z.b. einer 2 damit die führenden 0en nicht abgeschnitten werden.

Was wäre hier am besten oder gibt es vielleicht noch eine viel bessere Variante ?

Vielen Dank !


----------



## Nico Graichen (1. Juli 2008)

Hi

Ich versteh dein Vorhaben nicht ganz.
Was hast du vor? Willst du anhand einer Bestellung wissen, an welchem Wochentag diese aufgegeben wurde? Wenn ja, bieten die DBMS meist Funktionen, die dir dies zurückliefern.


----------



## planb2000 (1. Juli 2008)

Hallo,


hast du die dir die tabellen überlegt? Wie diese zueinander in relation stehen könnten, oder willst du alles in 1ne tabelle schreiben.

welches DBMS benutzt Du (Oracle, MySQL.....)

wenn irgendetwas automatisiert passieren soll, kann man dazu TRIGGER verwenden


----------



## TutorialKing (1. Juli 2008)

Es sind sich wiederholende Bestellungen. Das heisst in diesem bsp. dem festgelegten Zeitraum jeden Montag, Mittwoch und Freitag.
Alles ist davon variabel.

1.Mein Datenbankmodell ist fertig, es geht nur noch um dieses eine Problem.
Ein extra Tabelle für die Wochentage ist denke ich nicht nötig, da man die Information im Prinzip in einer Spalte ablegen kann.

2.Es wird mysql verwendet, ich denke aber es ist bei diesem Problem egal welche Datenbank letzendlich verwendet wird.

3.Davon soll nichts automatisiert passieren, es geht einfach darum welches die beste Möglichkeit ist Wochentage abzulegen.


----------



## TutorialKing (2. Juli 2008)

Ich versuche es nochmal genau zu erklären.
Jeder Datensatz hat verschiedene Zeiträume.
bsp :
von 01.06.2008
bis 25.07.2008
oder auch
von 01.08.2008
bis 25.12.9999

Jetzt kann man zu jedem Datensatz festlegen welche(r) Tag(e) eine Lieferung erfolgen soll.
Das heisst bei Datensatz 1 soll jeden Mo und Di. ausgeliefert werden.
Bei Datensatz 2 soll Mo,Di,Mi,Do,Fr. eine Auslieferung erfolgen usw.
Irgendwo muss ich diese Information ja speichern.
Ich hoffe ich habe es jetzt verständlicher dargestellt.


----------



## shutdown (2. Juli 2008)

Und wieso willst du dafür die genauen Daten abspeichern?

Bestellungen
-> Bestellungsid
-> sonstiger Kram

Lieferungen_am
-> id
-> join_Bestellungsid
-> join_Wochentagsid

Wochentage
-> id
-> Langtext.


Mit diesen 3 Tabellen kannst du zu jeder Bestellung abfragen, wann eine Lieferung erfolgen soll. Den nächsten Mittwoch oder Freitag von heute oder einem bestimmten Datum an zu ermitteln, geht zum einen über Datenbankfunktionen zum anderen hast du ja auch eine Programmlogik.


----------



## ms76ec (3. Juli 2008)

Mein Favorit wär:

Tabelle wochentage:
id tinyint unsigned, name varchar(10) 

bei Bestellung:
lieferung tinyint unsigned

lieferung dann als binäres UND der Wochentags-IDs
also z.B.:
keine Lieferung -> 0 (0000000)
Lieferung montags -> 1 (0000001)
Lieferung dienstags -> 2 (0000010)
Lieferung mittwochs -> 4 (0000100)
Lieferung mo,mi,fr -> 21 (0010101)
Lieferung an allen Tagen ->127 (1111111)


----------



## TutorialKing (4. Juli 2008)

> Bestellungen
> -> Bestellungsid
> -> sonstiger Kram
> 
> ...



Also das geht leider überhaupt nicht. 3 Tabellen um die Wochentage zu speichern. Performance techn. leider sehr schlecht.



> Mein Favorit wär:
> 
> Tabelle wochentage:
> id tinyint unsigned, name varchar(10)
> ...



Daran hatte ich auch schon gedacht, allerdings würde bei deinem Beispiel sämtliche führenden 000 abgeschnitten. Man müsste z.b. immer eine 9 davor setzen dann klappt das.

Es geht aber noch besser man verwendet einfach den Datentyp SET. 

Danke !


----------



## ms76ec (4. Juli 2008)

Nicht als String, sondern als Zahl speichern! Dann hast Du auch nicht das Problem mit den führenden Nullen. Die Zahlen werden zwar bei einm simplen SELECT dezimal angezeigt, lassen sich aber wunderbar binär manipulieren und auswerten.
z.B.
Alle, die (auch) dienstags beliefert werden:

```
SELECT * from bestellung where lieferung&2;
```

Alle die ausschließlich dienstags beliefert werden:

```
SELECT * from bestellung where lieferung=2;
```

Alle die ausschließlich montags und mittwochs beliefert werden:

```
SELECT * from bestellung where lieferung=5;
```

Alle die (auch) montags und mittwochs beliefert werden:

```
SELECT * from bestellung where lieferung&5;
```

Die Zahlen entsprechen dabei der Summe der IDs.

SETs  erscheinen mir hier ein wenig umständlicher und weniger universell in der Handhabung.


----------



## TutorialKing (4. Juli 2008)

Ok jetzt habe ich dein System verstanden. Ich wollte das nicht als string abspeichern sondern auch als Zahl aber direkt in binärer Form also nicht 0,1,2,4 usw. sondern 000001.
Bei Text werden auch keine führenden 00 abgeschnitten sondern bei Zahl.

Da der SET Typ das ganze intern auch als Zahl abspeichert wäre jetzt die Frage was hier effektiver ist. Ich vermute mal das es performance techn. auf das gleiche herauskommt, also nur noch eine Geschmacksache ist was man benutzt.

Aber der Tipp ist super. Danke !


----------

