抽出関数は便利なようで、私が見つけた日付関数は私の問題のいくつかを解決しますが、PostgreSQLのdate_truncを複製する方法はありますか?
確かに、EXTRACT
この特定のケースに最も近いものになるようです。
PGの元のコード:
WHERE date_trunc('month', QUERY_DATE) BETWEEN
date_trunc('month', now()) - INTERVAL '4 MONTH' AND
date_trunc('month', now() - INTERVAL '1 WEEK')
EXTRACT
を使用する :
WHERE EXTRACT(YEAR_MONTH FROM QUERY_DATE)
BETWEEN
EXTRACT(YEAR_MONTH FROM NOW() - INTERVAL 4 MONTH)
AND
EXTRACT(YEAR_MONTH FROM NOW() - INTERVAL 1 WEEK)
機能的には同じである必要がありますが、これは実際には、比較を行う前に日付をYYYYMM文字列にマングリングしています。
別のオプションは、DATE_FORMAT
を使用することです。 日付文字列を再構築して月の初めに強制するには:
WHERE DATE_FORMAT(QUERY_DATE, '%Y-%m-01')
BETWEEN
DATE_FORMAT(NOW() - INTERVAL 4 MONTH, '%Y-%m-01')
AND
DATE_FORMAT(NOW() - INTERVAL 1 WEEK, '%Y-%m-01')
また、フィールドにインデックスが付けられている場合でも、MySQLは日付範囲の処理が非常に貧弱であることに注意してください。注意しないと、おそらく全表スキャンになってしまうでしょう。