PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : mySQL, wieder eine Bitte an die Profis



GrazerTourer
27-11-2015, 11:20
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°C hat! Also Tmin>=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! :)

MTB-Pirate
27-11-2015, 11:50
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')) < 12
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.

mafe
27-11-2015, 12:58
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')
) < 20 then 'Keine Tropennacht'
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

NoDoc
27-11-2015, 13:36
:wink: mein Beitrag dazu:

https://www.youtube.com/watch?v=iWdfxfQ7qgE

GrazerTourer
27-11-2015, 13:50
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) <= 12
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