MySQLの現在の日時から30日を差し引くにはどうすればよいですか?
SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();
MySQLの現在の日時から30日を差し引くにはどうすればよいですか?
SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();
回答:
SELECT * FROM table
WHERE exec_datetime BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY) AND NOW();
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-add
使用したくない人にはDATE_SUB、次を使用してCURRENT_DATEください:
SELECT CURRENT_DATE - INTERVAL 30 DAY
NOW() - INTERVAL 30 DAYた場合よりも読みやすくなりますが、結果は異なります。質問には「現在の日時から30日を引く」と記載されているため、OPが望んでいない場合があります。
current_timestamp代わりに使用current_date
NOW()クエリは毎回異なるため、クエリのキャッシュや最適化が失われるため、使用しないでください。MySQLのドキュメントで、使用してはいけない関数のリストを参照してください。
以下のコードでは、このテーブルが時間とともに大きくなっていると仮定します。新しいコンテンツが追加され、過去30日間のコンテンツのみを表示したいとします。これは最も一般的なケースです。
日付は文字列として追加されていることに注意してください。NOW()関数を使用してキャッシュを強制終了するよりも、呼び出しコードからこの方法で日付を追加することをお勧めします。
SELECT * FROM table WHERE exec_datetime >= DATE_SUB('2012-06-12', INTERVAL 30 DAY);
あなたは使用することができBETWEENますが、実際には非常に二本の前に非常秒30日間に、このからものをしたい場合は、私は簡略化されたクエリがうまくあなたを提供することを願っているが、私の経験では一般的なユースケースではありません。
NOW()、それでもあなたの答えでそれを使います。o_O PS:クエリは、OPが望んでいるものではなく、別の結果を返します
BETWEENおよび>=異なる演算子である、あなたは知っていますか?私のクエリは30 days ago AND today、thisの結果セットを制限していますeverything after 30 days ago。したがって、tomorrowレコードは私のものと元のクエリでは一致しませんが、この回答では一致します
MySQLは今から日数を引きます:
select now(), now() - interval 1 day
プリント:
2014-10-08 09:00:56 2014-10-07 09:00:56
その他の時間間隔式の単位引数:
https://dev.mysql.com/doc/refman/5.5/en/expressions.html#temporal-intervals
select now() - interval 1 microsecond
select now() - interval 1 second
select now() - interval 1 minute
select now() - interval 1 hour
select now() - interval 1 day
select now() - interval 1 week
select now() - interval 1 month
select now() - interval 1 year
日付だけが必要で時間は必要ない場合:
select*from table where exec_datetime
between subdate(curdate(), 30)and curdate();
curdate()時間コンポーネントを省略しているため、日付のみに関心がある場合の方が、「意味的に正しい」よりも高速で、「意味的に正しい」可能性now()があります。
また、subdate()の2値のオーバーロードは、を使用するよりも潜在的に高速ですinterval。
interval曜日以外のコンポーネントが必要な場合のためのものです。
subdate(curdate(), 30)がよりも速いと主張していCURRENT_DATE - INTERVAL 30 DAYますか?証拠はありますか?そして、それはどれくらい速いでしょうか?数マイクロ秒?
subdate潜在的に高速であることがおそらく「2アリティオーバーロード」によって何らかの形で説明されていると思いますが、これが愚かな質問である場合は、それらの単語の意味(関数に関して) )?特に「2アリティ」とは?
curdate()OPは「現在の日時から30日を差し引く」ように見えたため(強調事項)、質問の文言に関しては、実際には間違った選択である可能性があります。