2011-01-31 7 views
0

curdate()を使用してDB内のエントリを取得しようとしていますが、私が認識していない基本的なロジックがあると思います。たとえば:MySQLでの比較でのcurdate()の動作

SELECT * FROM foo WHERE event='bar' 
AND created_at >= SUBDATE(CURDATE(), 90) 
AND created_at <= CURDATE() 

この呼び出しは、過去90日間に戻りますが、今日のエントリはありません。私が理解しているように、curdate()はYYYY-MM-DDまたはYYYYMMDDだけであり、時刻を完全に無視するので、curtime()とnow()のために保存します。私は、Railsで同様の呼び出しを行い、DateTime.beginning_of_dayとして日付を渡すと、それは他の方法とは異なり、今日までは特定の時間までは含まれないため、ここに時間が含まれていると思われます。

私は、MySQLリファレンスマニュアルを含むいくつかのソースをチェックアウトしましたが、本当の答えは出ていません。現在の時間の要素がクエリに含まれている可能性はありますか、それとも閉鎖されている他のビジネスがあるのでしょうか?

答えて

4

created_at列が完全なdatetimeタイプの場合、日付と比較すると、その日付の先頭になります。

したがって、2011-01-01と比較すると、2011-01-01 00:00:00と似ています。だからCURDATE()の返信が返ってこないのです(created_atタイムスタンプがの場合、正確にの真夜中です)。

例:

select curdate(); 
-- 2011-01-31 

select cast(curdate() as datetime); 
-- 2011-01-31 00:00:00 

select if('2011-01-31' <= curdate(), 'yep', 'not this time'); 
-- yep 

select if('2011-01-31 00:00:01' <= curdate(), 'yep', 'not this time'); 
-- not this time 

select if('2011-01-31 01:00:00' <= adddate(curdate(), interval 1 day), 'yep', 'not this time'); 
-- yep 
+0

1:疑いで、列のデータ型を確認する - MySQLはDATEがあり、DATETIME。 –

+0

明らかにその列はTIMESTAMPであり、私が読んでいるところでは、TIMESTAMPに対応しようとする前に列をDATETIMEに変更する必要があるようです。それが正確だとお考えですか? – keybored

+0

@keybored。正確に - それを 'DATE'と比較しています。 'DATE'と' TIMESTAMP'を比較すると、その日の始めに真夜中(0時間、0分、0秒)と仮定されます。 'TIMESTAMP'と' TIMESTAMP'を比較するか、 'DATE'の間にレコードを取得するために' adddate'のようなものを使うかのどちらかです。 – jerhinesmith