SQL 2005 pour calculer le lever/coucher du soleil en fonction de la latitude/longitude


Un plan parfait, prendre stationnaire pendant une lettre au Père Noël et de calculer le lever et le coucher du soleil pour une latitude/longitude donnée dans SQL 2005. uh uh, ici nous allons.

Calcule le lever et le coucher du soleil dans SQL, cela devrait être amusant.




D'abord et thustly, il y aura un grand nombre de fonctionnalités et quelques procédures stockées. Tous suivent, ici, ce est la feuille de route de haut niveau:

Ordre de fonctions SQL et les procédures stockées appeler:

1. appelle usp_sunrise_PST

a. udf_calcOffset_PST et usp_sunrise

2. demande usp_sunrise:

a. Phase 2: udf_calcTime_rising/UDF-calTime_setting dont l'appel:

i. udf_calcDayofYear

3. Étape 4: udf_suntruelon

4. étape 5a-c: udf_sunRtAscension

5. 6/7 étapes: udf_H_Sunrise/udf_H_Sunset

Mais ne vous inquiétez pas, il suffit de créer des fonctions et des procédures stockées en copiant et en exécutant le code ci-dessous et suivre la section «Exemple d'utilisation '. Vous découvrirez que le temps les lampadaires se éteignent avant que vous savez.

  • algorithme coucher de soleil
    Sunrise Sunset Algorithme
  • coucher de soleil exemple
    Sunrise Sunset Algorithme Exemple
  • Fonctions SQL 2005 de convertir le temps en décimal et décimal Temps
    SQL pour passer de 2,5 à 02h30 et de 02h30 à 2,5
  • SQL trouver First Sun Novembre et de trouver 2ème Soleil en Mars (plus isDaylightSavingsTime)
    Découvrez si DST (pour udf_calcOffset_PST)
  • SQL 2005 interception des erreurs (usp_GetError Info)
    usp_GetErrorInfo hub pour la récupération d'erreur
  • Vérifiez lever/coucher du soleil
    Lien externe pour vérifier le bon timing

Exemple d'utilisation

dichiararedateT datetime, @ d1Time décimal (28,4) setdateT = «25/06/09» EXEC usp_sunrise_PST CalendarDate = DateT, latitude = 33, longitude = -116, decimalTime = @ d1Time sortie EXEC usp_sunset_PST CalendarDate = DateT, latitude = 33 --33 longitude = -116 à -116 decimalTime = @ d1Time sortie --select 'décimal Temps' = @ d1Time --select dbo.TimeFromDecimal (@ d1Time, DateT) --select dbo.TimeFromDecimal (@ d1Time, «01/01/1800») --Select Dbo.TimeToDecimal («5: 45: 00: 08 ')

usp_sunrise_PST

Septembre ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO - ============================================= - Auteur: - Date de création: 12/01/09 - Description: usp_sunrise_CA calcule le lever du soleil pour heure normale du Pacifique Zone - ============================================= CREATE PROCEDURE [dbo]. [Usp_sunrise_PST] - Ajoutez les paramètres de la procédure stockée ici CalendarDate Datetime, année --day decimalelatitude (28,4), --lat (ouest négative, est positive) decimalelongitude (28,4), --lon (neg sud, pos nord) - @ Zenith nvarchar (155), --step7a - Int @ Localoffset, --hours de UT decimalTime en décimal (28,4) sortie Temps --decimal AS COMMENCER - SET NOCOUNT ON ajouté pour empêcher le jeu de résultats dans plus de - Intervenir dans les instructions SELECT. SET NOCOUNT ON; BEGIN TRY - DichiararedateT datetime - SetdateT = «25/06/09» DECLARE @ d1Time décimal (28,4), ioffset int setiOffset = (sélectionnez dbo.udf_calcOffset_PST (CalendarDate)) Usp_sunrise EXEC CalendarDate = CalendarDate, latitude = 33 --33 longitude = -116 à -116 -Zenith = '11', - localoffset = ioffset, --hours de UT decimalTime = @ d1Time sortie sélectionnez 'Time décimal' = @ d1Time sélectionnez dbo.TimeFromDecimal (@ d1Time, CalendarDate) End Try BEGIN CATCH - Effectuer erreur de récupération de routine. RUN usp_GetErrorInfo; CATCH END; FIN

usp_sunset_PST

Septembre ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO - ============================================= - Auteur: - Date de création: 12/01/09 - Description: usp_sunrise_CA calcule le lever du soleil pour heure normale du Pacifique Zone - ============================================= CREATE PROCEDURE [dbo]. [Usp_sunset_PST] - Ajoutez les paramètres de la procédure stockée ici CalendarDate Datetime, année --day decimalelatitude (28,4), --lat (ouest négative, est positive) decimalelongitude (28,4), --lon (neg sud, pos nord) - @ Zenith nvarchar (155), --step7a - Int @ Localoffset, --hours de UT decimalTime en décimal (28,4) sortie Temps --decimal AS COMMENCER - SET NOCOUNT ON ajouté pour empêcher le jeu de résultats dans plus de - Intervenir dans les instructions SELECT. SET NOCOUNT ON; BEGIN TRY - DichiararedateT datetime - SetdateT = «25/06/09» DECLARE @ d1Time décimal (28,4), ioffset int setiOffset = (sélectionnez dbo.udf_calcOffset_PST (CalendarDate)) Usp_sunset EXEC CalendarDate = CalendarDate, latitude = 33 --33 longitude = -116 à -116 -Zenith = '11', - localoffset = ioffset, --hours de UT decimalTime = @ d1Time sortie sélectionnez 'Time décimal' = @ d1Time sélectionnez dbo.TimeFromDecimal (@ d1Time, CalendarDate) End Try BEGIN CATCH - Effectuer erreur de récupération de routine. RUN usp_GetErrorInfo; CATCH END; FIN

usp_sunrise

Septembre ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO - ============================================= - Auteur: - Date de création: - Description: calculer le temps du coucher du soleil: --http: //williams.best.vwh.net/sunrise_sunset_algorithm.htm --http: //williams.best.vwh.net/sunrise_sunset_example.htm - ============================================= CREATE PROCEDURE [dbo]. [Usp_sunrise] - Ajoutez les paramètres de la procédure stockée ici CalendarDate Datetime, année --day decimalelatitude (28,4), --lat (ouest négative, est positive) decimalelongitude (28,4), --lon (neg sud, pos nord) - @ Zenith nvarchar (155), - étape 7a. localoffset int, --hours de UT decimalTime en décimal (28,4) sortie Temps --decimal AS COMMENCER - SET NOCOUNT ON ajouté pour empêcher le jeu de résultats dans plus de - Intervenir dans les instructions SELECT. SET NOCOUNT ON; BEGIN TRY --sunrise/coucher du soleil DECLARE decimalet (28,4), M décimal (28,4), L décimal (28,4), RA décimal (28,4), H_Sunrise décimal (28,4), H_sunset décimal (28,4), Entre-temps décimal (28,4), UT décimal (28,4) -localoffset Int --hours de UT --2. convertir la valeur de la longitude de temps et de calculer une période difficile --rising jeu @ t = (sélectionnez dbo.udf_calcTime_rising (CalendarDate, longitude)) --setting - Sept. = (sélectionnez dbo.udf_calcTime_setting (CalendarDate, longitude)) --3. calcule anomalie moyenne du Soleil SETM = (0,9856 * t) - 3289 --4. calcule la vraie longitude du Soleil setl = (sélectionner dbo.udf_suntruelon (M)) --5a-C. calcule ascension droite du Soleil Setra = (sélectionnez dbo.udf_sunRtAscension (L)) -6. calcule la déclinaison du Soleil --7a. calculer l'angle de l'heure locale Sun setH_Sunrise = (sélectionner dbo.udf_H_Sunrise (L, latitude)) - SetH_Sunset = (sélectionnez dbo.udf_H_Sunset (L, latitude)) --8. le calcul de la/paramètre croissant moyenne locale - T = H + RA - (0,06571 * t) - 6,622 setmeanTime = H_Sunrise + RA - (0,06571 * t) - 6,622 -9. réajuster à UTC - UT = T - lngHour Entre-temps Setut = - (@ longitude/15.) Setut @ UT = 24% - REMARQUE: UT doit éventuellement être ajustée dans l'intervalle [0,24) en ajoutant/soustrayant 24 --10. UT convertir la valeur à l'fuseau horaire local de latitude/longitude --setlocaloffset = (sélectionnez dbo.udf_calcOffset_Edwards (CalendarDate)) - LocalT = UT + localOffset setdecimalTime = UT + localoffset --localoffset de Greenwich: sélectionnez getUTCDate () - getdate () --warning que l'heure d'ne est pas juste dans SQL 2005 --http: //wwp.daylight-saving-time.com/usa/dst-2007.htm - Conclut premier dimanche de Novembre, commence la deuxième Soleil en Mars --Convertir décimales hh: mm: ss: ms jour civile --Select Dbo.TimeFromDecimal (decimalTime, dateTime) --Select Dbo.TimeFromDecimal (decimalTime '01/01/1890',) End Try BEGIN CATCH - Effectuer erreur de récupération de routine. RUN usp_GetErrorInfo; CATCH END; FIN

usp_sunset

Septembre ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO - ============================================= - Auteur: - Date de création: - Description: calculer le temps de lever: --http: //williams.best.vwh.net/sunrise_sunset_algorithm.htm --http: //williams.best.vwh.net/sunrise_sunset_example.htm - ============================================= CREATE PROCEDURE [dbo]. [Usp_sunset] - Ajoutez les paramètres de la procédure stockée ici CalendarDate Datetime, année --day decimalelatitude (28,4), --lat (ouest négative, est positive) decimalelongitude (28,4), --lon (neg sud, pos nord) - @ Zenith nvarchar (155), - étape 7a. localoffset int, --hours de UT decimalTime en décimal (28,4) sortie Temps --decimal AS COMMENCER - SET NOCOUNT ON ajouté pour empêcher le jeu de résultats dans plus de - Intervenir dans les instructions SELECT. SET NOCOUNT ON; BEGIN TRY --sunrise/coucher du soleil DECLARE decimalet (28,4), M décimal (28,4), L décimal (28,4), RA décimal (28,4), H_Sunrise décimal (28,4), H_sunset décimal (28,4), Entre-temps décimal (28,4), UT décimal (28,4) -localoffset Int --hours de UT --2. convertir la valeur de la longitude de temps et de calculer une période difficile --rising - Set @ t = (sélectionnez dbo.udf_calcTime_rising (CalendarDate, longitude)) --setting sem = (sélectionnez dbo.udf_calcTime_setting (CalendarDate, longitude)) --3. calcule anomalie moyenne du Soleil SETM = (0,9856 * t) - 3289 --4. calcule la vraie longitude du Soleil setl = (sélectionner dbo.udf_suntruelon (M)) --5a-C. calcule ascension droite du Soleil Setra = (sélectionnez dbo.udf_sunRtAscension (L)) -6. calcule la déclinaison du Soleil --7a. calculer l'angle de l'heure locale Sun - SetH_Sunrise = (sélectionnez dbo.udf_H_Sunrise (L, latitude)) setH_Sunset = (sélectionnez dbo.udf_H_Sunset (L, latitude)) --8. le calcul de la/paramètre croissant moyenne locale - T = H + RA - (0,06571 * t) - 6,622 setmeanTime = H_Sunset + RA - (0,06571 * t) - 6,622 -9. réajuster à UTC - UT = T - lngHour Entre-temps Setut = - (@ longitude/15.) Setut @ UT = 24% - REMARQUE: UT doit éventuellement être ajustée dans l'intervalle [0,24) en ajoutant/soustrayant 24 --10. UT convertir la valeur à l'fuseau horaire local de latitude/longitude --setlocaloffset = (sélectionnez dbo.udf_calcOffset_Edwards (CalendarDate)) - LocalT = UT + localOffset setdecimalTime = UT + localoffset --localoffset de Greenwich: sélectionnez getUTCDate () - getdate () --warning que l'heure d'ne est pas juste dans SQL 2005 --http: //wwp.daylight-saving-time.com/usa/dst-2007.htm - Conclut premier dimanche de Novembre, commence la deuxième Soleil en Mars --Convertir décimales hh: mm: ss: ms jour civile --Select Dbo.TimeFromDecimal (decimalTime, dateTime) --Select Dbo.TimeFromDecimal (decimalTime '01/01/1890',) End Try BEGIN CATCH - Effectuer erreur de récupération de routine. RUN usp_GetErrorInfo; CATCH END; FIN

udf_calcDayofYear

Septembre ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO - ============================================= - Auteur: - Date de création: - Description: donner civile jour 01/01/02 et sera de retour 1, --Select Dbo.udf_calcDayofYear ('12/31/01 ') renvoie 365 - ============================================= créer FONCTION [dbo]. [Udf_calcDayofYear] ( datetime ddate ) Retourne int AS COMMENCER DECLARE @ N1 int, int @ N2, N3 @ int, INTn définir @ N1 = étage (275 * (sélectionnez un mois (ddate))/9) définir @ N2 = floor (((select mois (ddate)) + 9)/12) définir @ N3 = (1 + étage (((sélectionnez l'année (ddate)) - 4 * étage ((sélectionnez l'année (ddate))/4) + 2)/3)) SETN N1 = @ - (@ * @ N2 N3) + (certains jours (ddate)) - 30 RITORNON FIN

udf_calcOffset_PST

- ============================================= - Auteur: - Date de création: 26/11/09 - Description: envoyer à une date et donner le décalage - Pour le fuseau horaire de Greenwich - - ============================================= CREATE FUNCTION [dbo]. [Udf_calcOffset_PST] ( - Ajoutez les paramètres de la fonction ici CalendarDate Datetime ) Retourne int AS COMMENCER DICHIARAREiOffset int --num heure de Greenwich --localoffset de Greenwich: sélectionnez getUTCDate () - getdate () --warning que l'heure d'ne est pas juste dans SQL 2005 --http: //wwp.daylight-saving-time.com/usa/dst-2007.htm - Conclut premier dimanche de Novembre, commence la deuxième Soleil en Mars -8 Heures si le temps standard + 1 si l'heure (heure d'été) IF ((sélectionnez dbo.udf_isDaylightSavingsTime (CalendarDate)) = 0) COMMENCER setiOffset = -8 FIN Autre COMMENCER setiOffset = -7 FIN - Retourne le résultat de la fonction RITORNOiOffset FIN

udf_calcTime_rising

Septembre ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO - ============================================= - Auteur: - Date de création: - Description: - ============================================= CREATE FUNCTION [dbo]. [Udf_calcTime_rising] (DatetimedDate, decimalelongitude (28,4)) RETOURS décimal (28,4) AS COMMENCER --2. convertir la valeur de la longitude de temps et de calculer une période difficile - - LngHour = longitude/15 - - Si vous voulez temps de montée: - T = N + ((6 - lngHour)/24) - Si vous voulez le temps de prise: - T = N + ((18 - lngHour)/24) DICHIARARElngHour décimal (28,4), @ t décimal (28,4) --sett = '10: 01 'Janvier 1, 1900 10:01 --printt - Setlongitude --117Â = -117 ° 09'O à San Diego, CA setlngHour = longitude/15. - Si vous voulez temps de montée: --sett = N + ((6 -lngHour)/24) sem = (sélectionnez dbo.udf_calcDayofYear (ddate)) + ((6 -lngHour)/24.) ---- Si le temps est le paramètre souhaité: - Sept. = N + ((-lngHour 18)/24) - Retourne le résultat de la fonction RITORNOt FIN

udf_calcTime_setting

Septembre ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO - ============================================= - Auteur: - Date de création: - Description: - ============================================= CREATE FUNCTION [dbo]. [Udf_calcTime_setting] (DatetimedDate, decimalelongitude (28,4)) RETOURS décimal (28,4) AS COMMENCER --2. convertir la valeur de la longitude de temps et de calculer une période difficile - - LngHour = longitude/15 - - Si vous voulez temps de montée: - T = N + ((6 - lngHour)/24) - Si vous voulez le temps de prise: - T = N + ((18 - lngHour)/24) DICHIARARElngHour décimal (28,4), @ t décimal (28,4) --sett = '10: 01 'Janvier 1, 1900 10:01 --printt - Setlongitude --117Â = -117 ° 09'O à San Diego, CA setlngHour = longitude/15. - Si vous voulez temps de montée: --sett = N + ((6 -lngHour)/24) --sett = (sélectionnez dbo.udf_calcDayofYear (ddate)) + ((6 -lngHour)/24) ---- Si le temps est le paramètre souhaité: - Sept. = N + ((-lngHour 18)/24) sem = (sélectionnez dbo.udf_calcDayofYear (ddate)) + ((18 -lngHour)/24.) - Retourne le résultat de la fonction RITORNOt FIN

udf_H_Sunrise

Septembre ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO - ============================================= - Auteur: - Date de création: - Description: - ============================================= CREATE FUNCTION [dbo]. [Udf_H_Sunrise] (DecimaleL (28,4), decimalelatitude (28,4)) RETOURS décimal (28,4) AS COMMENCER DICHIARAREzenith décimal (28,4), @ Sindec décimal (28,4), COSDEC décimal (28,4), Cosh décimal (28,4) , H_SUNRISE DECIMAL (28,4) - Zenith: zénith du Soleil pour le lever/coucher du soleil - Offical = 90 ° 50 '(ce en radians = 1,585341) - Cos (01h58) = -, 01 454 - civils = 96 degrés - nautiques = 102 degrés - astronomiques = 108 degrés setzenith = radians (90 + 50/60.) - officiel -6. calcule la déclinaison du Soleil setsinDec = 0,39782 * sin (pi ()/180 * @ L) setcosDec = cos (asin (Sindec)) --7a. calculer l'angle de l'heure locale Sun setcosH = (cos (zénith) - (Sindec * sin (latitude @ * PI ()/180)))/(COSDEC * cos (latitude @ * pi ()/180)) if (CSST> 1) COMMENCER - Imprimer 'le soleil ne se lève pas à cette position (la date indiquée)' retourner 99,99 FIN if (cosh <-1) COMMENCER retourner 99,99 - Imprimer 'le soleil ne se couche jamais sur cette position (la date indiquée)' FIN --7b. terminer le calcul de H et les convertir en heures SETH_SUNRISE = 360 - acos (CSST) * 180/pi () SETH_SUNRISE = @ H_SUNRISE/15. - Retourne le résultat de la fonction RITORNOH_SUNRISE FIN

udf_H_Sunset

Septembre ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO - ============================================= - Auteur: - Date de création: - Description: - ============================================= CREATE FUNCTION [dbo]. [Udf_H_Sunset] (DecimaleL (28,4), decimalelatitude (28,4)) RETOURS décimal (28,4) AS COMMENCER DICHIARAREzenith décimal (28,4), @ Sindec décimal (28,4), COSDEC décimal (28,4), Cosh décimal (28,4), H_SUNSET DECIMAL (28,4) - Zenith: zénith du Soleil pour le lever/coucher du soleil - Offical = 90 ° 50 '(ce en radians = 1,585341) - Cos (01h58) = -, 01 454 - civils = 96 degrés - nautiques = 102 degrés - astronomiques = 108 degrés setzenith = radians (90 + 50/60). -6. calcule la déclinaison du Soleil setsinDec = 0,39782 * sin (pi ()/180 * @ L) setcosDec = cos (asin (Sindec)) --7a. calculer l'angle de l'heure locale Sun setcosH = (cos (zénith) - (Sindec * sin (latitude @ * PI ()/180)))/(COSDEC * cos (latitude @ * pi ()/180)) if (CSST> 1) COMMENCER - Imprimer 'le soleil ne se lève pas à cette position (la date indiquée)' retourner 99,99 FIN if (cosh <-1) COMMENCER retourner 99,99 - Imprimer 'le soleil ne se couche jamais sur cette position (la date indiquée)' FIN --7b. terminer le calcul de H et les convertir en heures SETH_SUNSET = acos (CSST) * 180/pi () SETH_SUNSET = @ H_SUNSET/15. - Retourne le résultat de la fonction RITORNOH_SUNSET FIN

udf_sunRtAscension

Septembre ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO - ============================================= - Auteur: - Date de création: - Description: - ============================================= CREATE FUNCTION [dbo]. [Udf_sunRtAscension] (L décimal (28,4)) RETOURS décimal (28,4) AS COMMENCER DICHIARARERA décimal (28,4), Lquadrant DECIMAL (28,4), RAquadrant DECIMAL (28,4) --5a. calcule ascension droite du Soleil - - RA = atan (0,91764 * tan (L)) - REMARQUE: RA doit éventuellement être ajustée dans l'intervalle [0360) en ajoutant/soustrayant 360 SETRA = 180/pi () * (atan (0,91764 * tan (@ L * pi ()/180))) SETRA @ RA = 360% --5b. Valeur de l'ascension droite doit être dans le même quadrant que L - - Lquadrant = (plancher (L/90)) * 90 - RAquadrant = (plancher (RA/90)) * 90 - RA = RA + (Lquadrant - RAquadrant) SETLquadrant = (étage (@ L/90)) * 90 SETRAquadrant = (étage (@ RA/90)) * 90 SETRA = RA + (Lquadrant -RAquadrant) --5c. Valeur de l'ascension droite doit être converti en heure - RA = RA/15 SETRA = RA/15. RitornoRA FIN

udf_sunTrueLon

Septembre ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO - ============================================= - Auteur: - Date de création: - Description: - ============================================= CREATE FUNCTION [dbo]. [Udf_sunTrueLon] (M décimal (28,4)) RETOURS décimal (28,4) AS COMMENCER DICHIARAREL décimal (28,4) --4. calcule la vraie longitude du Soleil - L = M + (1,916 * sin (M)) + (0,020 * sin (2 * M)) + 282,634 - REMARQUE: Le potentiel doit être ajusté dans la gamme [0360) en ajoutant/soustrayant 360 setl = M + (1,916 * sin (@ M * pi ()/180)) + (0,020 * sin (2 * @ M * pi ()/180)) + 282,634 SETL @ L = 360% RITORNOL FIN

Conclusion

Donc, ce est l'histoire. Et bien sûr, vous avez besoin de changer la fonction de décalage avec le décalage par rapport à l'heure UTC (il ya un lien dans funciton ci-dessus pour voir qui vous êtes) - Essais et erreurs se emploiera également à déterminer la compensation pour la fonction. Voici un temps checker lever/coucher du soleil pour se assurer que la fonction est en marche.

Ce était au sujet d'un creusement de la semaine et le codage à venir avec un algorithme pour calculer légitime lever/coucher du soleil pour lat/long. Espérons que Microsoft va nous sourire et d'intégrer ces capacités dans leurs prochaines versions, mais jusque-là, nous sommes ici.

Et comme promis, notre lettre au Père Noël,

Nous aimerions beaucoup de films à regarder sur notre chemin vers la lune. Merci beaucoup et bonjour à Rudolph, dites Comet a laissé ses bandes dessinées à notre place et Prancer pour quitter laissant ses jouets près de la porte. Je espère que vous avez le velours Pantalons Gore Tex nous vous avons envoyé. Notre meilleur à Mme

la Kringles

(0)
(0)

Commentaires - 0

Sans commentaires

Ajouter un commentaire

smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile
Caractères restants: 3000
captcha