Abfrage : Datum

Ich rede nicht davon das man ohne Exclusion Constraint Schwachsinn in die Tabelle schreiben kann. Ich rede davon das die Anwendung oder die Datenbank dafür sorgen, das der Wert "bis" vom nächsten verfügbaren Wert "von" abhängig ist. Wird diese Abhängigkeit umgesetzt (von Anweundung oder DB, egal ob trivial oder nicht) ist die Exclusion überflüssig, sie sorgt ja nur für eine Fehlermeldung.
 
Werbung:
Hi,

das sollte weiter helfen.

MariaDB [bernd]> DESCRIBE artikel;
+-------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+------------------+------+-----+---------+----------------+
| a_id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| bezeichnung | varchar(64) | YES | | NULL | |
+-------------+------------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

MariaDB [bernd]> DESCRIBE `art_preise`;
+------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------------+------+-----+---------+----------------+
| id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| artikel | int(11) | YES | | NULL | |
| gueltig_ab | date | YES | | NULL | |
| preis | decimal(11,5) | YES | | NULL | |
+------------+------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)


MariaDB [bernd]> select * from artikel;
+------+-------------------+
| a_id | bezeichnung |
+------+-------------------+
| 4711 | koelsch wasser |
| 4712 | besseres wasser |
| 4713 | sehr gutes wasser |
| 4714 | spitzenwasser |
+------+-------------------+
4 rows in set (0.00 sec)

MariaDB [bernd]> select * from art_preise;
+----+---------+------------+---------+
| id | artikel | gueltig_ab | preis |
+----+---------+------------+---------+
| 1 | 4711 | 2010-01-01 | 3.69000 |
| 2 | 4711 | 2010-01-01 | 3.69000 |
| 3 | 4712 | 2009-02-01 | 3.70000 |
| 4 | 4712 | 2009-12-12 | 3.85000 |
| 5 | 4714 | 2012-12-05 | 5.60000 |
| 6 | 4714 | 2014-06-12 | 7.95000 |
+----+---------+------------+---------+
6 rows in set (0.00 sec)

MariaDB [bernd]>

Lösung 1:
Ergibt alle Artikel, auch die ohne Preise:

MariaDB [bernd]> SELECT art.a_id AS Artikelnummer,
-> art.bezeichnung AS Bezeichnung,
-> ap.gueltig_ab AS Preis_ab,
-> ap.preis AS Preis
-> FROM artikel art
-> LEFT JOIN art_preise ap ON art.a_id = ap.artikel AND gueltig_ab <= NOW()
-> GROUP BY artikel
-> ORDER BY art.`a_id`, gueltig_ab ASC;
+---------------+-------------------+------------+---------+
| Artikelnummer | Bezeichnung | Preis_ab | Preis |
+---------------+-------------------+------------+---------+
| 4711 | koelsch wasser | 2010-01-01 | 3.69000 |
| 4712 | besseres wasser | 2009-02-01 | 3.70000 |
| 4713 | sehr gutes wasser | NULL | NULL |
| 4714 | spitzenwasser | 2012-12-05 | 5.60000 |
+---------------+-------------------+------------+---------+
4 rows in set (0.00 sec)


Lösung 2:

und bei diese werden die Artikel ohne Preise unterdrückt

MariaDB [bernd]> SELECT art.a_id AS Artikelnummer,
-> art.bezeichnung AS Bezeichnung,
-> ap.gueltig_ab AS Preis_ab,
-> ap.preis AS Preis
-> FROM artikel art
-> LEFT JOIN art_preise ap ON art.a_id = ap.artikel
-> WHERE gueltig_ab <= NOW()
-> GROUP BY artikel
-> ORDER BY art.`a_id`, gueltig_ab ASC;
+---------------+-----------------+------------+---------+
| Artikelnummer | Bezeichnung | Preis_ab | Preis |
+---------------+-----------------+------------+---------+
| 4711 | koelsch wasser | 2010-01-01 | 3.69000 |
| 4712 | besseres wasser | 2009-02-01 | 3.70000 |
| 4714 | spitzenwasser | 2012-12-05 | 5.60000 |
+---------------+-----------------+------------+---------+
3 rows in set (0.00 sec)

Bei beiden Lösungen kann man auch Preise in der Zukunft eingeben.
Diese werden aber erst angezeigt wenn das Datum erreicht ist.

Gruss

Bernd
 
Zurück
Oben