私はわずかに複雑な時間計算の問題があります。 私はリマインダーシステムを持っています。ここで、ユーザーは「何回前に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は日付の比較を乱している可能性があります。
ほとんどすべての日付範囲の算術を試しましたが、このクエリで適格なレコードを取得できませんでした。
SELECT "のカレンダーを"。* "カレンダー" WHERE( 'とき'> = CAST( 'DATETIME AS 2011-01-11午前16時54分49秒)' AND '' <「CAST FROM(2011- 01-11 16:55:49 'AS DATETIME)) - データベースからすべての行を返します。 "when"列はすべて小文字です – Ved
問題を表示または再現できるようにDDLステートメントとINSERTステートメントを投稿できますか? –
https://gist.github.com/776061 - カレンダーモデルのDDLを更新する。前もってありがとうございます – Ved