# Selektieren nach Datum, Monat, Tag in date- und datetime-Formaten



## sharmuur (30. April 2010)

Hallo,

ich möchte in eine MySQL-DB (version 4.1.x ) eine Tabelle, anlegen. Die ursprungliche Tabelle in EXCEL sieht wie folgt aus:

Datum  Uhrzeit  Parameter  Messwert

Ich möchte später in der Tabelle die Datensätze nach Jahr, Monat, Tag und Uhrzeit selectieren. 

Ich hätte 3 zwei Alternativen das Datum und die Uhrzeit in der Tabelle anzulegen.

Der erste wäre: Datum ( typ: DATE ), Uhrzeit ( typ: TIME )

Der zweite wäre: Datum und Uhrzeit ( typ: DATETIME ) 

Der dritte wäre: Jahr( typ:smallint), Monat( typ: smallint ), Tag( typ:smallint ), Uhrzeit ( typ: smallint ) hier nur immer auf volle Stunde berechnet(z.B. 12, 13 etc.). 

Jetzt kommt endlich die Frage. Kann man mann in der ersten und zweiten Variante nach Datum, Monat, Tag und Uhrzeit selectieren?
ZB. select messwert from Tabelle where jahr=2001 and monat=12 and tag=31

Kann jemand mir erfahrungsgemäß sagen, ob die ersten und zweite Varianten vorteilhafter sind als die dritte Variante. Die Variante kommt mir einfacher.

danke voraus


----------



## Yaslaw (30. April 2010)

sharmuur hat gesagt.:


> Selektieren nach datum, monat, tag in date und datetime formaten


öhm.. und nun?


----------



## sharmuur (30. April 2010)

aus Versehen abgeschickt 

jetzt is die Frage da


----------



## Yaslaw (30. April 2010)

Die 2te Variante macht in meinen Augen am meisten Sinn. Warum als INT speichern, wenns dafür ein passendes Format gibt.

Mit den Datums- und Zeitfunktionen kannst du nachher mehr oder weniger bequem darauf zugreiffen

Mit dem DATETIME-Typ kannst du nachher auch problemlos rechnen (Letzter Tag des Monats, 30 Tage addieren etc)


```
SELECT *
FROM myTable
WHERE
	YEAR(myDateField) = 2010
	AND MONTH(myDateField) = 4
	AND DAY(myDateField) = 30;
```
oder	

```
SELECT *
FROM myTable
WHERE DATE(myDateField) = STR_TO_DATE('30.04.2010', '%d.%m.%Y');
```


----------



## sharmuur (30. April 2010)

Hallo Yaslow,

danke für die wertvolle Tipps. Jetzt kann ich zweifelfrei meine DB anlegen.

Gruß


----------



## sharmuur (30. April 2010)

Hätte noch eine Frage. Das Datum in der EXCEL-Tabell liegt im folgenden Format vor: 31.12.2001. 
Ich habe gerade auf der Webseite http://dev.mysql.com/doc/refman/5.1/de/date-and-time-types.html gelesen, dass man das datum nur in der Reihenfolge 2001.12.31 speichern kann und dass das Trennzeichen "-" sein sollte. 
Gibt es keine Möglichkeiten ausser dieser? 
Da ich mindestens 8 millionen Datensätze in dem Format habe, wird es mir sehr viel Zeit kosten wenn ich die Positionen von jahr und tag wechsele. Gibt es irgendwelche tricks?

Gruß


----------



## Yaslaw (30. April 2010)

Du erstellt aus dem Excel eine Temporäre Tabelle in der Datenbank. Das Datumsfeld definierst du da als Varchar.
Dann machst du ein INSERT-Query zur Zieldatenbank mit allen notwendigen Konvertierungen


```
INSERT INTO myTable
	(id, datum, bezeichnung)
SELECT 
	id,
	STR_TO_DATE(datum, '%d.%m.%Y'),
	bezeichnung
FROM 
	tempMyTable;
```


----------



## sharmuur (30. April 2010)

danke danke,

ich teste es gleich


----------



## vandamp (2. Mai 2010)

man hätte auch im Excel das Format der Zelle ändern können.

rechtsklick -->zelle formatieren --> Benutzerdefiniert YYYY-MM-DD so macht er dir aus 12-10-2009   2009-10-12


----------



## Yaslaw (3. Mai 2010)

vandamp hat gesagt.:


> man hätte auch im Excel das Format der Zelle ändern können.
> 
> rechtsklick -->zelle formatieren --> Benutzerdefiniert YYYY-MM-DD so macht er dir aus 12-10-2009   2009-10-12



Macht manchmal Sinn, manchmal auch nicht. Wenn du das Excel als Datenquelle bekommst (im Falle von csv-Dateien als Datentransfer zwieschen Systemen) ist es mühsam jedesmal zuerst das Excel zu öffnen um das Feld anzupassen.


----------



## sharmuur (5. Mai 2010)

ich habe alles genau nach deiner Anweisung durchgeführt. Es hat super geklappt. 
Gruß


----------

