mysql 5.0.45: Funktion um Sonnenauf- und Untergang zu berechnen

deadland

Grünschnabel
Liebe Gemeinde,

wie kann ich unter MySQL 5.0.45 den Sonnenauf- bzw. untergang an einem bestimmt (wie soll es auch sonst sein) Ort berechnen?

Danke
 
Hallo deadland,

du möchtest den Sonnenaufgang bzw. -untergang mit SQL-Mitteln berechnen?

Theoretisch ist das möglich, du braucht in der Datenbank die entsprechenden Daten wie z.B. Datum, Längengrad u.ä. und dann kannst du diese Formeln benutzten:
http://lexikon.astronomie.info/zeitgleichung/

Mit MySql kann man ja sin, cos usw. berechnen.

Wenn du es fertig hast, dann kannst du ja mal den SQL posten. Dann kann man sehen, ob es auch praktisch funktioniert.
 
Gut ich habe die Procedures erstellt:


Sonnenuntergang:

Code:
DELIMITER $$

DROP PROCEDURE IF EXISTS `solardb`.`sunrise`$$
CREATE DEFINER=`solardb`@`%` PROCEDURE `sunrise`(lat float(6,4), lon float(6,4), T int, TZ int)
begin

	#Diese Funktion basiert auf der Zeitgleichung URL: http://lexikon.astronomie.info/zeitgleichung/ 

	declare B float(9,7); 		# Variable für geographische Breite deklarieren
	declare D float(9,7);		# Variable für Deklination der Sonne deklarieren
	declare h float(5,4) default -0.0145; # geforderte Horizonthöhe h=-50 in Bogenminuten
	declare zeitdiff float(9,7);	# Variable für Resultat aus Zeitdifferenz deklarieren 
	declare zeitglg float(9,7);	# Variable für Resultat aus Zeitgleichung deklarieren
	declare AMOZ float(9,7);	# Variable für Resultat aus Sonnenaufgang nach MOZ
	declare sunrise float(9,7);	# Variable für Resultat aus Sonnenaufgang unter Berücksichtigung der Zeitzone
		
	set B=radians(lat); 					#Umrechnung Grad zu Rad von geographischer Breite
	set D=0.40954*sin(0.0172*(T-79.349740));		#Berechnung: Deklination der Sonne
	set zeitdiff=12*acos((sin(h)-sin(B)*sin(D))/(cos(B)*cos(D)))/pi();
	set zeitglg=-0.1752*sin(0.033430*T+0.5474)-0.1340*sin(0.018234*T-0.1939);
	set AMOZ=12-zeitdiff-zeitglg;
	set sunrise=AMOZ-lon/15+TZ;

	select sec_to_time(sunrise*3600);

end$$

DELIMITER ;

Sonnenuntergang:

Code:
DELIMITER $$

DROP PROCEDURE IF EXISTS `solardb`.`sunset`$$
CREATE DEFINER=`solardb`@`%` PROCEDURE `sunset`(lat float(6,4), lon float(6,4), T int, TZ int)
begin

	#Diese Funktion basiert auf der Zeitgleichung URL: http://lexikon.astronomie.info/zeitgleichung/ 

	declare B float(9,7); 		# Variable für geographische Breite deklarieren
	declare D float(9,7);		# Variable für Deklination der Sonne deklarieren
	declare h float(5,4) default -0.0145; # geforderte Horizonthöhe h=-50 in Bogenminuten
	declare zeitdiff float(9,7);	# Variable für Resultat aus Zeitdifferenz deklarieren 
	declare zeitglg float(9,7);	# Variable für Resultat aus Zeitgleichung deklarieren
	declare UMOZ float(9,7);	# Variable für Resultat aus Sonnenaufgang nach MOZ
	declare sunset float(9,7);	# Variable für Resultat aus Sonnenaufgang unter Berücksichtigung der Zeitzone
		
	set B=radians(lat); 					#Umrechnung Grad zu Rad von geographischer Breite
	set D=0.40954*sin(0.0172*(T-79.349740));		#Berechnung: Deklination der Sonne
	set zeitdiff=12*acos((sin(h)-sin(B)*sin(D))/(cos(B)*cos(D)))/pi();
	set zeitglg=-0.1752*sin(0.033430*T+0.5474)-0.1340*sin(0.018234*T-0.1939);
	set UMOZ=12+zeitdiff-zeitglg;
	set sunset=UMOZ-lon/15+TZ;

	select sec_to_time(sunset*3600);

end$$

DELIMITER ;

PROBLEM:

Wie kann ich die Ergebnisse von beiden Procedures subtrahieren?

Code:
select subtime(CALL sunset(52.5,13.5,30,1),CALL sunrise(52.5,13.5,30,1));

Funktioniert nicht!:mad:
 
Zuletzt bearbeitet:
Hallo deadland,

das sieht ja schon super aus, aber warum benutzt du Procedure und nicht Function?

Funktionen haben im Gegensatz zu Proceduren einen Rückgabewert, den du weiterverarbeiten kannst.

Dann funktioniert auch dein
select subtime(CALL sunset(52.5,13.5,30,1),CALL sunrise(52.5,13.5,30,1));
 
Aber jetzt:

Code:
DELIMITER $$

DROP FUNCTION IF EXISTS `solardb`.`sunrise`$$
CREATE DEFINER=`solardb`@`%` FUNCTION `sunrise`(lat float(6,4), lon float(6,4), T int, TZ int) RETURNS time
    DETERMINISTIC
begin 

	#Diese Funktion basiert auf der Zeitgleichung URL: http://lexikon.astronomie.info/zeitgleichung/ 

	declare B float(9,7); 		# Variable für geographische Breite deklarieren
	declare D float(9,7);		# Variable für Deklination der Sonne deklarieren
	declare h float(5,4) default -0.0145; # geforderte Horizonthöhe h=-50 in Bogenminuten
	declare zeitdiff float(9,7);	# Variable für Resultat aus Zeitdifferenz deklarieren 
	declare zeitglg float(9,7);	# Variable für Resultat aus Zeitgleichung deklarieren
	declare AMOZ float(9,7);	# Variable für Resultat aus Sonnenaufgang nach MOZ
	declare sunrise float(9,7);	# Variable für Resultat aus Sonnenaufgang unter Berücksichtigung der Zeitzone
		
	set B=radians(lat); 					#Umrechnung Grad zu Rad von geographischer Breite
	set D=0.40954*sin(0.0172*(T-79.349740));		#Berechnung: Deklination der Sonne
	set zeitdiff=12*acos((sin(h)-sin(B)*sin(D))/(cos(B)*cos(D)))/pi();
	set zeitglg=-0.1752*sin(0.033430*T+0.5474)-0.1340*sin(0.018234*T-0.1939);
	set AMOZ=12-zeitdiff-zeitglg;
	set sunrise=AMOZ-lon/15+TZ;

	return sec_to_time(sunrise*3600);

end$$

DELIMITER ;

Code:
DELIMITER $$

DROP FUNCTION IF EXISTS `solardb`.`sunset`$$
CREATE DEFINER=`solardb`@`%` FUNCTION `sunset`(lat float(6,4), lon float(6,4), T int, TZ int) RETURNS time
    DETERMINISTIC
begin

	#Diese Funktion basiert auf der Zeitgleichung URL: http://lexikon.astronomie.info/zeitgleichung/ 

	declare B float(9,7); 		# Variable für geographische Breite deklarieren
	declare D float(9,7);		# Variable für Deklination der Sonne deklarieren
	declare h float(5,4) default -0.0145; # geforderte Horizonthöhe h=-50 in Bogenminuten
	declare zeitdiff float(9,7);	# Variable für Resultat aus Zeitdifferenz deklarieren 
	declare zeitglg float(9,7);	# Variable für Resultat aus Zeitgleichung deklarieren
	declare UMOZ float(9,7);	# Variable für Resultat aus Sonnenaufgang nach MOZ
	declare sunset float(9,7);	# Variable für Resultat aus Sonnenaufgang unter Berücksichtigung der Zeitzone
		
	set B=radians(lat); 					#Umrechnung Grad zu Rad von geographischer Breite
	set D=0.40954*sin(0.0172*(T-79.349740));		#Berechnung: Deklination der Sonne
	set zeitdiff=12*acos((sin(h)-sin(B)*sin(D))/(cos(B)*cos(D)))/pi();
	set zeitglg=-0.1752*sin(0.033430*T+0.5474)-0.1340*sin(0.018234*T-0.1939);
	set UMOZ=12+zeitdiff-zeitglg;
	set sunset=UMOZ-lon/15+TZ;

	return sec_to_time(sunset*3600);

end$$

DELIMITER ;

Jetzt funktionierts, allerdings verstehe ich irgendwie nicht was eine Procedur ist ...
 
Zurück