PostgreSQLで、先週分のデータを取得したい場合ありますよね?
例えば、単純に7日前〜昨日までとかでデータを取得すると、SQLを実行する日付によって変わってきてしまいます。
なので先週の日曜日から土曜日までを固定でデータを取りたいという場合の対応。
SELECT (now() + CAST('-' || (extract(dow from now()) + 7) || ' day' AS INTERVAL))::DATE;
まず上記で、今日の日付から、先週の日曜日のデータが取得できます。
※extractを使うと日曜日=0,月曜日=1というデータが取得でき、そこに7日を足した分を、頭の’-‘でマイナスを付けて引いています。
同様に、先週の土曜日のデータを取得する方法は以下になります
SELECT (now() + CAST('-' || (extract(dow from now()) + 1) || ' day' AS INTERVAL))::DATE;
単純に+7だったのを、+1に変えてあげればいいですね。
上記データを元に、実際の先週分を取得するSQLサンプルはこちら
SELECT 列名
FROM テーブル名
WHERE
created >= (SELECT (now() + CAST('-' || (extract(dow from now()) + 7) || ' day' AS INTERVAL))::DATE)
AND created < (SELECT (now() + CAST('-' || (extract(dow from now())) || ' day' AS INTERVAL))::DATE)
先週の土曜日までを取得したいのに、+1がなくなっているのは、「今週の日曜より小さいデータ」を取得して「先週分」とするためです。
以上です。自分もたまにしか使わず忘れてしまうので、誰かのご参考になれば!
2018年7月30日月曜日
2018年6月17日日曜日
PostGisを1.5.3から2.0にアップデートしたときに発生したSQLエラー対応
PostGisを1.5.3から2.0にアップデートしたときに、既存のpostgisからデータを取得するSQLで下記のようなエラーが発生。
1. GeometryFromText 指定名称、指定引数型に合う関数がありません。明示的な型キャストが必要かもしれません
2. 関数geometryfromtext(unknown, integer)は存在しません
3. 関数expand_sphere_pseudo(geometry, integer)は存在しません
4. リレーション spatial_ref_sys への権限がありません
もともとPostgis1.5.3で実際に流していたSQLは以下のようなもの
SELECT上記で、半径1000m以内のデータを取得していた。DISTANCEには、現在地からの距離。
/*省略*/
trunc(distance_sphere(A.geo, GeometryFromText('POINT(139.000 35.000)', 4326))) as DISTANCE
FROM
/*省略*/
WHERE
expand_sphere_pseudo(GeomFromText('POINT(139.000 35.000)', 4326), 1000) && A.geo
AND distance_sphere(A.geo, GeometryFromText('POINT(139.000 35.000)', 4326)) < 1000
1については、そもそもGeometryFromTextという関数がなくなっていた。
Postgis2.0では、ST_GeomFromTextを代わりに利用する模様。
2,3の関数geometryfromtextとdistance_sphereを使って、半径1000m以内のデータを取得しようとしていた処理では
ST_DWithinという関数を使って実現する。
最終的なPostgis2.0に対応したSQLは以下で結果が正常に返ってきた
SELECT
/*省略*/
trunc(ST_Distance(A.geo, ST_GeomFromText('POINT(139.000 35.000)', 4326))) as DISTANCE
FROM
/*省略*/
WHERE
ST_DWithin(A.geo, ST_GeomFromText('POINT(139.000 35.000)', 4326), 1000,true)
リレーション spatial_ref_sys への権限がありません
というエラーについては
/usr/share/pgsql/contrib/postgis-2.0/spatial_ref_sys.sql
上記のSQLを流すことで解決
psql -U postgres db名 -f /usr/share/pgsql/contrib/postgis-2.0/spatial_ref_sys.sql
登録:
投稿 (Atom)