2011-01-11 3 views
1

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.

Répondre

0

Selon votre serveur et sa charge, une fenêtre d'une minute pour cron pourrait être un peu optimiste. Que se passe-t-il si vous vous connectez au serveur dbms et exécutez cette instruction SQL? Des lignes sont-elles retournées? Des messages d'erreur?

Vous pouvez essayer une conversion de type explicite. Donc

'when' >= CAST('2011-01-11 14:44:54' AS DATETIME) ... 

Votre dbms peut nécessiter une syntaxe différente pour le cast et la conversion. Recherchez vos documents.

Vos noms de colonne sont-ils sensibles à la casse? La colonne "quand" ou "quand"? (Ou wHen?)

Cette requête renvoie votre événement de test. Notez les guillemets autour du nom de la colonne.

SELECT "calendars".* 
FROM "calendars" 
WHERE ("when" >= '2011-01-10 15:56' 
    AND "when" < '2011-01-10 15:57') 
+0

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

+0

Pouvez-vous poster des instructions DDL et INSERT afin que nous puissions voir ou reproduire le problème. –

+0

https://gist.github.com/776061 - mettre à jour DDL pour le modèle de calendrier. Merci d'avance – Ved

Questions connexes