Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQL Frage zu Datumswerten (https://www.delphipraxis.net/164494-sql-frage-zu-datumswerten.html)

fillibuster 15. Nov 2011 16:36

Datenbank: MySQL • Version: 5.1 • Zugriff über: PHP

SQL Frage zu Datumswerten
 
Hallo,

in meiner Tabelle speichere ich Start- und Enddaten von Zeiträumen. DIe Frage ist, ob ich mir alle Daten (Tage) eines Zeitraumes von MySQL zurückgeben lassen kann. Beispiel:
startdatum: 2011-11-15
enddatum: 2011-11-21
Rückgabe: array(15,16,17,18,19,20,21)
Geht das nur mit MySQL?

Viele Grüße ....

//Edit: Es gehen natürlich auch mehrere Zeiträume in einem Monat

mkinzler 15. Nov 2011 17:13

AW: SQL Frage zu Datumswerten
 
Was meinst du mit "nur mit MySQL"?

fillibuster 15. Nov 2011 18:11

AW: SQL Frage zu Datumswerten
 
Hi,

Zitat:

Zitat von mkinzler (Beitrag 1136343)
Was meinst du mit "nur mit MySQL"?

die Query soll mir die Werte entsprechend zurückliefern, ohne dass ich diese noch mit PHP in Form bringe. Allerdings wird das bei monatsübergreifenden Daten schwer :stupid:

Viele Grüße ....

Furtbichler 15. Nov 2011 19:53

AW: SQL Frage zu Datumswerten
 
KA, wozu das gut sein soll, aber in richtigen RDBMS macht man sowas mit einer UDF. mySQL kennt aber so ein komischen Befehl, wo man Werte einzelner Records in einer Zeile darstellen kann.

Du bastelst Du also eine Tabelle, die alle Tage seit dem 1.1.0000 enthält ('AlleTage')
Dann ein
Code:
select Tag
  from AlleTage join
  deineTabelle on AlleTage.Tag between DeineTabelle.AnfangsDatum and DeineTabelle.EndDatum
Das dann mit diesem komischen Befehl in eine Zeile bringen und fertig ist das.

Aber wozu du das brauchst, ist mir ein Rätsel.

Sir Rufo 15. Nov 2011 20:19

AW: SQL Frage zu Datumswerten
 
Das ist ein klassischer Fall für eine Stored Procedure

Dort in einer temporären Tabelle die Datumswerte zusammenstellen und dann entweder als Result-Set oder über GROUP_CONCAT als VARCHAR zurückliefern.

Eine Monster-Tabelle mit allen Datumswerten - dafür wäre mir der Speicherplatz zu schade ;)

jobo 15. Nov 2011 21:44

AW: SQL Frage zu Datumswerten
 
Du kannst auch eine Monstertabelle nehmen, die bereits existiert und dich daran "anlehnen". Dann geht es mit einem bloßen Select Statement oder einer View. Je nach Bedarf dann mit Offset und Einschränkungen arbeiten. In jedem Fall sollte sichergestellt sein, dass die Basistabelle groß genug ist. Bei Verwendung eines variablen Offset ist das allerdings machbar.

Im Prinzip erzeugst Du mittels der Basistabelle ein fortlaufende Nummer, die Du in ein Datum umwandelst. Das musst Du nur noch nach Bedarf formatieren. Etwa so:

SQL-Code:
mysql> select curdate();
+------------+
| curdate() |
+------------+
| 2011-11-15 |
+------------+
1 row in set (0.00 sec)

mysql> # Jahreswechsel, relativ zu curdate (s.o)
mysql> SELECT ADDDATE(Curdate(), INTERVAL rownum+40 DAY)
    -> FROM  (SELECT IF(@a, @a := @a + 1, @a := 1) - 1 AS rownum
    ->        FROM  information_schema.TABLES t,
    ->               (SELECT @a := 0) r) x
    -> WHERE x.rownum < 10;
+--------------------------------------------+
| ADDDATE(Curdate(), INTERVAL rownum+40 DAY) |
+--------------------------------------------+
| 2011-12-25                                 |
| 2011-12-26                                 |
| 2011-12-27                                 |
| 2011-12-28                                 |
| 2011-12-29                                 |
| 2011-12-30                                 |
| 2011-12-31                                 |
| 2012-01-01                                 |
| 2012-01-02                                 |
| 2012-01-03                                 |
+--------------------------------------------+
10 rows in set (0.00 sec)

mysql> # Schaltjahr 2011, Februar, relativ zu curdate (s.o)
mysql> SELECT ADDDATE(Curdate(), INTERVAL rownum-265 DAY)
    -> FROM  (SELECT IF(@a, @a := @a + 1, @a := 1) - 1 AS rownum
    ->        FROM  information_schema.TABLES t,
    ->               (SELECT @a := 0) r) x
    -> WHERE x.rownum < 10;
+---------------------------------------------+
| ADDDATE(Curdate(), INTERVAL rownum-265 DAY) |
+---------------------------------------------+
| 2011-02-23                                  |
| 2011-02-24                                  |
| 2011-02-25                                  |
| 2011-02-26                                  |
| 2011-02-27                                  |
| 2011-02-28                                  |
| 2011-03-01                                  |
| 2011-03-02                                  |
| 2011-03-03                                  |
| 2011-03-04                                  |
+---------------------------------------------+
10 rows in set (0.00 sec)
p.s.: Irgendwie ist die Formatierung hops, aber man kann es glaub ich auch so erkennen.

Furtbichler 16. Nov 2011 07:04

AW: SQL Frage zu Datumswerten
 
Zitat:

Zitat von Sir Rufo (Beitrag 1136382)
Eine Monster-Tabelle mit allen Datumswerten - dafür wäre mir der Speicherplatz zu schade ;)

"Monster"? Kommst Du aus Lilliput? ;-) Na, wie viele Zeilen hätte die? 365*2000, also ca. 730.000 Zeilen, das ist doch nix. Dein Lieblingslied verbrät mehr Speicher.

Die Monstertabelle hat einen kleinen Vorteil. Du kannst mal eben Wochenenden und Feiertage mit ablegen, und auch sonst lustige Details wie z.B. "letzter Tag des Monats". Letzteres ist sehr wichtig für Rechnungslegung usw. Sowas kann man auch ausrechnen, aber bei Datenbanken rechnet man nicht blöd rum , man aggregiert höchstens mal.

Auch so kniffeliege Fragen wie 'wieviele Arbeitstage liegen zwischen dem 1.10.2011 und 12.11.2011' lässt sich mit dieser Monstertabelle instantan und ohne Nachdenken beantworten.

Falls man es braucht.

fillibuster 16. Nov 2011 07:05

AW: SQL Frage zu Datumswerten
 
Hallo,
Zitat:

Zitat von Furtbichler (Beitrag 1136375)
KA, wozu das gut sein soll, ...

Es geht darum einen Zeitraum in einem Monatskalender farbig darzustellen, aber wenn ich das so lese, mach ich das lieber schnell mit PHP.

Vielen Dank für eure Antworten :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz