Zum Inhalt springen

mySQL, wieder eine Bitte an die Profis


GrazerTourer
 Teilen

Empfohlene Beiträge

Hallo,

 

Ich habe wieder einmal eine für mich recht komplizierte Abfrage für mySQL.

 

Vereinfacht sieht meine Tabelle so aus (restliche Spalten ausgeblendet).

Es gibt pro Minute einen Temperaturwert.

datetime		temp
01/08/2015 18:40	20.4
01/08/2015 18:41	20.4
01/08/2015 18:42	20.5
01/08/2015 18:43	20.5
01/08/2015 18:44	20.4
01/08/2015 18:45	20.4
01/08/2015 18:46	20.4
01/08/2015 18:47	20.4
01/08/2015 18:48	20.4
01/08/2015 18:49	20.4
01/08/2015 18:50	20.3
01/08/2015 18:51	20.3
01/08/2015 18:52	20.4
01/08/2015 18:53	20.4
01/08/2015 18:54	20.4
01/08/2015 18:55	20.4
01/08/2015 18:56	20.4
01/08/2015 18:57	20.4
01/08/2015 18:58	20.4
01/08/2015 18:59	20.4
01/08/2015 19:00	20.2
01/08/2015 19:01	20.2
01/08/2015 19:02	20.1
01/08/2015 19:03	20.1
01/08/2015 19:04	20.1
01/08/2015 19:05	20.1

 

Ich möchte nun Tropennächte berechnen.

Eine Tropennacht ist es dann, wenn es zwischen 18:00 und 06:00 Uhr nie =20.

Die Zuordnung ist immer das Datum nach 0:00Uhr!

 

Das heißt:

Wenn es In der Nacht von 01. auf den 02. zwischen 18:00Uhr (am 01.) und 06.00Uhr (am 02.) nie unter 20°C hat, muss als Ergebnis der 02. ausgespuckt werden. -> Am 02. gab es eine Tropennacht.

 

Wie mache ich die Abfrage denn? Ich kann natürlich leicht abfragen, ob es zwischen 18:00 und 00:00 Uhr immer >=20°C hat und das Gleiche für 00:00-06:00 Uhr, aber diese Zeilen haben dann ein anderes Datum und ich tu mir schwer die zu verheiraten. Hmmm.

 

Danke herzlichst! :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich habs mal auf einer Oracle Datenbank probiert, aber SQL Befehle unterscheiden sich ja nur in Details.

 

select to_char(datetime+6/24), min(temp) from TABELLE_XX

where to_number(to_char(datetime+6/24,'hh24'))

group by to_char(datetime+6/24)

 

liefert dir eine Liste mit Tagesdatum + die jeweilige Minimale Temp in deinem gewünschten Zeitraum.

Rest sollte dann einfach sein.

Der Trick dabei ist einfach die Zeit um 6 Stunden nach vorne zu schieben. Dann kann ich einfach sagen ich will nur die Ziet bis 12 Uhr.

Link zu diesem Kommentar
Auf anderen Seiten teilen

SQL-Server mit Subselect:

Select distinct convert(varchar(20), datum,4) as datum,

case

when

(

Select min(temp) from Table_1 innerTable

where innerTable.datum between convert(datetime, convert(varchar(20), dateadd(dd,-1,outerTable.datum),4) + ' 18:00') and convert(datetime, convert(varchar(20), outerTable.datum,4) + ' 06:00')

)

else

'Tropennacht' end as Tropennacht

 

from table_1 outerTable

order by datum

 

Alternativ kannst natürlich auch eine Funktion schreiben und das Datum mit reingeben und die Rückgabe auswerten. Performancetechnisch ist allerdings beides etwas problematisch.

 

lg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke euch!

Ich habe mir einmal den Vorschlag von MTB-Pirate angeschaut - klappt, mit ein paar ANpassungen super! :)

 

Wenn ich das Query für mySQL ändere auf:

select DATE_FORMAT((datetime + INTERVAL 6 HOUR),'%Y-%m-%d'), min(temp) from wettertabelle
where
convert(DATE_FORMAT(datetime + INTERVAL 6 HOUR,'%H'), SIGNED INTEGER) group by 
DATE_FORMAT((datetime + INTERVAL 6 HOUR),'%Y-%m-%d') 
having
min(temp)>=20

 

bekomme ich eine feine Liste:


DATE_FORMAT((datetime+6/24),'%Y-%m-%d')	min(temp)
2015-07-07	21.3
2015-07-20	20.9
2015-07-21	20.4
2015-07-22	20.4
2015-07-23	20.2
2015-08-05	20.0
2015-08-06	20.6
2015-08-07	21.6
2015-08-08	21.5
2015-08-09	20.6
2015-08-11	20.9
2015-08-12	21.9
2015-08-13	22.8
2015-08-14	20.7
2015-08-15	20.2
2015-08-29	20.0

 

Ich habe jetzt testweise am 06.07.2015 um 18:01 Uhr die Temperatur auf 19.0 gesetzt, um zu testen ob die Zeile rausfliegt. Haut hin! :)

 

DANKE!

 

@NoDoc

YEAH! :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

 Teilen

×
×
  • Neu erstellen...