J'ai un problème arithmétique de temps légèrement complexe. J'ai un système de rappel où l'utilisateur peut définir la durée "combien de x avant l'événement". Par exemple: Si je définis '5 minutes' - je dois recevoir un rappel avant 5 minutes du calendrier de l'événement.Localisateur de temps dynamique pour ActiveRecord
Dans mon système de rappel, j'ai un cron qui s'exécute toutes les minutes et envoie des mails de rappel. Jusqu'ici tout va bien. Je veux trouver tous les événements de calendrier qui sont éligibles pour rappel (entrée de calendrier dont le temps est prévu entre « 5.minutes.from_now et 6.minutes.from_now »
Je suis en train de la ÉCRIRE clause where:
conds = "'when' >= '#{eval("#{cal.remind_before.to_s}.#{cal.remind_before_what.downcase}.from_now").to_s(:db)}' AND 'when' < '#{eval("#{cal.remind_before.to_s}.#{cal.remind_before_what.downcase}.from_now + 1.minutes").to_s(:db)}'"
@mail_calendar_for_reminder= Calendar.find(:all, :conditions=> conds)
ici cal.reminder_before = '5', cal.remind_before_what.downcase = '' minutes de sorte que le eval serait d'évaluation (5.minutes.from_now) et (6.minutes.from_now)
la résultante La déclaration SQL est:
SELECT "calendars".* FROM "calendars" WHERE ('when' >= '2011-01-11 14:44:54' AND 'when' < '2011-01-11 14:45:54')
Ce SQL est syntaxiquement et logiquement correct car il obtient une plage de temps de 5.minutes.from_now et 6.minutes.from_now. Mais il ne sélectionne pas les enregistrements éligibles. Je soupçonne deux choses: 1. Le SQL ci-dessus fait des comparaisons de chaînes plutôt que des comparaisons de temps. 2. L'entrée de la base de données pour l'heure planifiée du calendrier a le format suivant:
2011-01-11 14:45:09. - les 0 peuvent être affectés par les comparaisons de dates.
J'ai essayé presque tous les types d'arithmétique de plage de dates, mais je n'ai pas pu obtenir les enregistrements éligibles dans cette requête.
SELECT "calendriers". * FROM "calendriers" Où ('quand'> = CAST ('2011-01-11 16:54:49 AS DATETIME)' ET 'quand' < « CAST (2011- 01-11 16:55:49 'AS DATETIME)) - retourne toutes les lignes de la base de données. La colonne "quand" est en minuscules – Ved
Pouvez-vous poster des instructions DDL et INSERT afin que nous puissions voir ou reproduire le problème. –
https://gist.github.com/776061 - mettre à jour DDL pour le modèle de calendrier. Merci d'avance – Ved