2011-01-11 11 views
1

私はわずかに複雑な時間計算の問題があります。 私はリマインダーシステムを持っています。ここで、ユーザーは「何回前にx回イベントするか」の期間を設定できます。例:「5分」を設定すると、イベントスケジュールの5分前にリマインダーを取得する必要があります。ActiveRecordの動的時間ベースのファインダ

私のリマインダーシステムでは、1分ごとに実行され、リマインダーメールを送信するcronがあります。ここまでは順調ですね。

:私は、その予定時間「5.minutes.from_nowと6.minutes.from_now」私は、次の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)  

cal.reminder_before = '5'、cal.remind_before_what.downcase = '分' 得

ので、評価は、(5.minutes.from_now)及び(6.minutes.from_now)を評価することになりますSQL文は次のとおりです。

SELECT "calendars".* FROM "calendars" WHERE ('when' >= '2011-01-11 14:44:54' AND 'when' < '2011-01-11 14:45:54') 

このSQLは、構文解析上および論理上、5分のfrom_nowおよび6.minutes.from_nowの時間範囲を取得するため、正しいです。しかし、それは適格な記録を選択していない。私は2つのことを疑う: 1.上記のSQLは時間比較ではなく文字列比較を行っている。 2.カレンダーの予定時刻のデータベースエントリは、次の形式です。
2011-01-11 14:45:09。 - 0は日付の比較を乱している可能性があります。

ほとんどすべての日付範囲の算術を試しましたが、このクエリで適格なレコードを取得できませんでした。

答えて

0

サーバーとその負荷に応じて、cronの1分間のウィンドウが少し楽観的かもしれません。

dbmsサーバにログインしてそのSQL文を実行するとどうなりますか?すべての行が返されますか?エラーメッセージはありますか?

明示的な型キャストを試すことができます。したがって

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

dbmsでは、型変換および変換に異なる構文が必要な場合があります。あなたのドキュメントを検索してください。

大文字と小文字は区別されますか?列は 'when'か 'when'ですか?

このクエリはテストイベントを返します。列名を二重引用符で囲んでください。

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

SELECT "のカレンダーを"。* "カレンダー" WHERE( 'とき'> = CAST( 'DATETIME AS 2011-01-11午前16時54分49秒)' AND '' <「CAST FROM(2011- 01-11 16:55:49 'AS DATETIME)) - データベースからすべての行を返します。 "when"列はすべて小文字です – Ved

+0

問題を表示または再現できるようにDDLステートメントとINSERTステートメントを投稿できますか? –

+0

https://gist.github.com/776061 - カレンダーモデルのDDLを更新する。前もってありがとうございます – Ved

関連する問題