veröffentlichung meiner Fragen und bekommene Antworten

Status
Für weitere Antworten geschlossen.

Kampfgummibaerlie

Datenbank-Guru
Beiträge
735
Nach einer Aufforderung veröffentliche ich jetzt hier meine gestellten Fragen, und bisherigen Antworten hier im Forum ;)

1.: Gibt es ein gutes (wenns geht kostenloses) Programm, wo man in PosgreSQL schreiben kann?
1.A.: Ist dabei, psql Kommandozeile. Wer es in bunt haben will: PGAdmin, Version 3 oder 4, sei gewarnt: harter Tobak, lohnt sich aber

2.: Sag mir mal ein Beispiel (Für die Kommandozeile), um eine Datenbank zu erstellen, und so weiter :S
2.A.: createdb blafasel

3.: Kennst du ein gutes Tutorial für PostgreSQL?
3.A.: PostgreSQL: Documentation: 9.6: PostgreSQL 9.6.2 Documentation

4.: Kann man in PostgreSQL eigentlich nach einem abgefragten Parameter filtern?
4.A.: Nein, SQL kann das nicht, Du kannst es aber in eine stored Procedure speichern, und dieser Parameter mitgeben

5.: Kann man der Procedure auch variable Werte mitgeben?
5.A.: test=*# create or replace function demo(in my_val int) returns text as $$begin return format ('Quadrat von %s ist : ', my_val) || (my_val * my_val)::text; end;$$language plpgsql;
CREATE FUNCTION
test=*# select demo(5);
demo
------------------------
Quadrat von 5 ist : 25
(1 Zeile)

Weil der gefragte es mir so vorgeschlagen hat ;)
Werde mich jetzt erstmal mit Punkt 5 auseinandersetzen, und womöglich weiterhin bestehende Fragen hier Posten.
 
Werbung:
5.: Kann man der Procedure auch variable Werte mitgeben?
5.A.: test=*# create or replace function demo(in my_val int) returns text as $$begin return format ('Quadrat von %s ist : ', my_val) || (my_val * my_val)::text; end;$$language plpgsql;
CREATE FUNCTION
test=*# select demo(5);
demo
------------------------
Quadrat von 5 ist : 25
(1 Zeile)

Da ich das Ganze verstehen möchte:
Wofür steht in ('Quadrat von %s ist : ', my_val) das %s ?
 
Nächste (selbst) beantwortete Frage:
Kann man in PostgreSQL die 2. Wurzel (Quadratwurzel) ziehen?:
SQRT(Zahl)
SQRT liefert die Quadratwurzel der übergebenen Zahl.
Beispiel:
SQRT(81) = 9

Nächste (selbst) beantwortete Frage:
Kann man in PostgreSQL den Restwert einer Division ermitteln?

Da ich selbst doch ziemlich interessiert in die Mathematik bin, und mir einen Taschenrechner (schon eine Weile her) in C++ schreiben wollte, kam ich drauf, dass man von einer Division den Restwert ermitteln kann. (Der Taschenrechner wurde nie fertig) Und es gibt den Mod() auch in PostgreSQL, habe noch keine eigenen Erfahrungen damit gesammelt, aber soweit ich weiß, braucht man diesen Wert, um höhere Wurzeln, als "nur" die Quadratwurzel ziehen zu können.
Poste hier gerne die Function, falls es mir gelingen sollte, höhere Wurzeln (natürlich mit 2 Variablen (1 für xte Wurzel, der andere für die zu ziehende Zahl) ziehen zu können.
 
Also kann ich meine gewollte Function gleich streichen ;D
Weil alles, über der 3. Wurzel ist eh nur für Theorie ... (Glaube ich ^^)
 
Ich bin wieder bei einer eher angewandten Datenbank, die ich freiwillig erstelle (muss nicht vollendet werden), und ich frage mich:
Tabelle 1 = t_a (Beispiel Uhrzeiten) (mit den 24 Stunden vom Tag, ich habs zum probieren in 10 Minuten-Schritten importiert)
Tabelle 2 = t_b (Beispiel Wochentage) (mit den 7 Wochentagen)
Tabelle 3 = t_c (Beispiel Öffnungszeiten) (mit Wochentag, Öffnung von und Öffnung bis)

Und ich möchte jetzt eine Tabelle erstellen, in welcher wiederum nur die Uhrzeiten enthalten sind, welche am entsprechenden Wochentag, falls geöffnet ist, in Öffnungszeiten sind.

Cross Join Wochentage mit Uhrzeiten AS Uhrzeiten an Wochentagen und diese wiederum left joinen mit Öffnungszeiten, und eine entsprechendes Where schreiben?
Oder funktioniert das irgendwie einfacher/sinnvoller/kreativer/.... in PostgreSQL?
 
Die Öffnungszeiten stehen doch schon in deiner Tabelle3?

Anyway, ich zeige Dir mal PostgreSQL ;-)

Das hat eine Menge eingebauter Datentypen, z.B. auch RANGE-Typen für z.B. Integer oder Timestamps oder Datumswerte - nicht aber für Zeiten. Macht nicht, bauen wir uns:

Code:
CREATE FUNCTION time_subtype_diff(x time, y time) RETURNS float8 AS
'SELECT EXTRACT(EPOCH FROM (x - y))' LANGUAGE sql STRICT IMMUTABLE;

CREATE TYPE timerange AS RANGE (
subtype = time,
subtype_diff = time_subtype_diff
);

Nun naben wir einen neuen Datentyp: TIMERANGE. Damit erstellen wir eine Tabelle der Öffnungszeiten: (Tag soll der Wochentag sein)

Code:
test=# create table oeffnungszeiten(geschaeft text, tag int, offen timerange);
CREATE TABLE
test=*# insert into oeffnungszeiten values ('Bäcker', 2, '[08:00,18:00)');
INSERT 0 1
test=*# insert into oeffnungszeiten values ('Bäcker', 3, '[08:00,18:00)');
INSERT 0 1
test=*# insert into oeffnungszeiten values ('Fleischer', 5, '[07:00,17:00)');
INSERT 0 1

Wer hat alles am Montag und am Dienstag jeweils 12:00 Uhr offen?

Code:
test=*# select * from oeffnungszeiten where tag = 1 and offen @> '12:00'::time;
 geschaeft | tag | offen
-----------+-----+-------
(0 Zeilen)

test=*# select * from oeffnungszeiten where tag = 2 and offen @> '12:00'::time;
 geschaeft | tag |  offen   
-----------+-----+---------------------
 Bäcker  |  2 | [08:00:00,18:00:00)
(1 Zeile)


Oder wir haben ein Hotel und vermieten Zimmer. Dabei will man aber kein Zimmer mehrfach vermieten:

Code:
test=*# create table hotel(zimmer int, gebucht daterange, exclude using gist(zimmer with =, gebucht with &&));
CREATE TABLE
test=*# insert into hotel values (1, '[2017-03-01,2017-03-10)');
INSERT 0 1
test=*# insert into hotel values (1, '[2017-03-10,2017-03-20)');
INSERT 0 1

Nun buchen wir mal vom 15. bis 25. März:

Code:
test=*# insert into hotel values (1, '[2017-03-15,2017-03-25)');
FEHLER:  kollidierender Schlüsselwert verletzt Exclusion-Constraint »hotel_zimmer_gebucht_excl«
DETAIL:  Schlüssel (zimmer, gebucht)=(1, [2017-03-15,2017-03-25)) kollidiert mit vorhandenem Schlüssel (zimmer, gebucht)=(1, [2017-03-10,2017-03-20)).

Und wenn Du eine Tabelle aller Minuten des heutigen Tagen haben willst (mal auf 10 begrenzt), dann geht das so auch On-the-fly:

Code:
test=*# select current_date + s * '1minute'::interval from generate_series(1, 10) s;
  ?column?   
---------------------
 2017-03-13 00:01:00
 2017-03-13 00:02:00
 2017-03-13 00:03:00
 2017-03-13 00:04:00
 2017-03-13 00:05:00
 2017-03-13 00:06:00
 2017-03-13 00:07:00
 2017-03-13 00:08:00
 2017-03-13 00:09:00
 2017-03-13 00:10:00
(10 Zeilen)

Oder noch eleganter:

Code:
select * from generate_series(current_date, current_date+1, '1minute'::interval);

Das Resultat zeige ich jetzt nicht, wird zu viel. Die Intervalgrenzen kannst Du natürlich auch ändern, z.B. auf 1 Stunde, 1 Sekunde oder $whatever. Solche Tabellen kannst Du auch in Joins dann verwenden.
 
Soda, ich mache mal eine Antwort, bevor ich mich damit näher auseinandersetze:

Vielen herzlichen dank für die entsprechenden bisherigen Beiträge, ich möchte, um ehrlich zu sein, für meine Mutter, die vor kurzem ein "Nähcafe" (Einen Raum, wo Nähmaschinen stehen, Leute kommen und nähen können) aufgemacht, und ich will mich ja meistens auf alle Eventualitäten vorbereiten, und denke, dass sie irgendwann eine Datenbank brauchen wird, weil sie, oder irgendein Cafe-Erbe, das ganze noch ausbauen könnte, im Moment würde zwar ein einfacher Kalender pro Maschine reichen, aber ja, habe mich mit Datenbanken (damals noch in OpenOffice) angefreundet, und bin überrascht, wie schnell man Dinge erlernen kann.
Und, da ich es ihr möglichst einfach machen möchte, werde ich ihr bei der Datenbankgeschichte ein wenig aushelfen, und ja, dabei bin ich gerade :D

Ran an die Arbeit (deinen Beitrag ;D)
 
FEHLER: Datentyp integer hat keine Standardoperatorklasse für Zugriffsmethode »gist«

Sagt er mir.... Sollte man eine Standardoperatorklasse vorher irgendwie definieren, bzw. kann man das? ^^
 
Ja, sorry. Da fehlt noch eine Extension, btree_gist.

Code:
test=# create database xxx;
CREATE DATABASE
test=# \c xxx
psql (9.6.1, Server 9.5.5)
Sie sind jetzt verbunden mit der Datenbank »xxx« als Benutzer »akretschmer«.
xxx=# create table hotel(zimmer int, gebucht daterange, exclude using gist(zimmer with =, gebucht with &&));
FEHLER:  Datentyp integer hat keine Standardoperatorklasse für Zugriffsmethode »gist«
TIP:  Sie müssen für den Index eine Operatorklasse angeben oder eine Standardoperatorklasse für den Datentyp definieren.
xxx=*# create extension btree_gist;
CREATE EXTENSION
xxx=*# create table hotel(zimmer int, gebucht daterange, exclude using gist(zimmer with =, gebucht with &&));
CREATE TABLE
xxx=*#

Ist halt wie immer: kaum macht man es richtig, schon geht es ...
 
nächste Frage :D

Kann man irgendwie machen, dass das Zimmer NICHT mietbar ist, solange kein Wert in "bucht bis" stehen würde.

Stelle mir das glaube ich gerade anders vor, als du es dir gedacht hast. (Es funktioniert einwandfrei, aber irgendwie hätte ich "gebucht von" und "gebucht bis" gerne in 2 Spalten) :/

Beispiel: Wir gehen von einem gemietetem Auto aus, wo die Rückkehr zum Vermieter unbekannt ist. Da möchte ich, wenn dieses 1 Auto mit ID 0815 zurzeit vermietet ist, dass man das ganze kein weiteres mal eintragen kann, der diese Maschine mietet :D

Oder hast du es ansich eh so programmiert, wie ich mir das Denke? (Könnte ja irgendwas vergessen haben)
 
Kann man irgendwie machen, dass das Zimmer NICHT mietbar ist, solange kein Wert in "bucht bis" stehen würde.
Das ist automatisch so:

Code:
xxx=*# select * from hotel ;
 zimmer | gebucht
--------+---------
(0 Zeilen)

xxx=*# insert into hotel values (1, '[2017-01-01,)');
INSERT 0 1
xxx=*# insert into hotel values (1, '[2017-02-01,)');
FEHLER:  kollidierender Schlüsselwert verletzt Exclusion-Constraint »hotel_zimmer_gebucht_excl«
DETAIL:  Schlüssel (zimmer, gebucht)=(1, [2017-02-01,)) kollidiert mit vorhandenem Schlüssel (zimmer, gebucht)=(1, [2017-01-01,)).

Eine offene obere Grenze ist wie 'gebucht bis alle Ewigkeit' und daher kann es, mit diesem Constraint, nicht noch einmal gebucht werden. Da ist DATERANGE verwende, ist es eine Spalte, und ich kann effektiv den Constraint definieren.
 
ReadyCLOUD

Ich glaube, ich verfolge das Ziel zu sehr :D

Meinst du, dass ich Fortschritte mache?

Sorry für das kleine Bild, bin aber gerade auf einem Laptop, der nicht wirklich der beste ist ;)
 
Werbung:
Status
Für weitere Antworten geschlossen.
Zurück
Oben