質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
pgAdmin

pgAdminは、オープンソースのPostgreSQL管理ツール。様々な機能を持ち、コマンドラインベースでPostgreSQLへ行う操作のほとんどをpgAdminを用いて実行することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

18175閲覧

SQL INTERVALの使い方

pro-poke5

総合スコア46

pgAdmin

pgAdminは、オープンソースのPostgreSQL管理ツール。様々な機能を持ち、コマンドラインベースでPostgreSQLへ行う操作のほとんどをpgAdminを用いて実行することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2017/06/12 00:48

編集2017/06/12 02:31

こんにちわ

DBはPostgres
SQLについての質問です

DBの中身はこのようになってます
イメージ説明

sql

1SELECT sum_year as T_DATE ,user_cnt as M_NO 2FROM t_sumlist 3WHERE sum_month = 12 4AND sum_day = 31 5AND sum_year >= 2010 6AND sum_year <= (2010 + INTERVAL '2' YEAR) ;

指定した日付から指定した期間のみのデータをとってきたいです
INTERVALを使って書きたいのですがエラーがでて何が間違いなのかがわかりません
キャストが必要とかなのでしょうか?

上のものでは2010/10/31から2年間分のデータをとってこようとしてます

アドバイスよろしくお願いいたします。

エラーーメッセージ
ERROR: 演算子が存在しません: integer + interval
SQLステート:42883
ヒント:指定名称、指定引数型に合う演算子がありません。明示的な型キャストが必要かもしれません
文字:169

追記
みなさまありがとうございます
同じ具合で何か月後、何日後はsum_dateを使うべきでしょうか?
月と日が32日以降13月以降がないため単純に足してはいけないのはわかるのですが…

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2017/06/12 00:51

定義とSQLでおおよそ想像はつくのですが、念のためエラーメッセージ全文を添付願います。
pro-poke5

2017/06/12 00:51

エラー文は、ERROR: 演算子が存在しません: integer + interval SQLステート:42883 ヒント:指定名称、指定引数型に合う演算子がありません。明示的な型キャストが必要かもしれません 文字:169 とでてきます。
m.ts10806

2017/06/12 01:19 編集

sum_XXXはsum_dateをそれぞれ分解しだだけに思えるのですが、sum_dateは使わずに行いたいのでしょうか?
pro-poke5

2017/06/12 01:32

sum_dateを使用しても構いません。指定した範囲の(この場合2年間)という年がとってこれれば大丈夫です。
guest

回答3

0

ベストアンサー

sum_dateを使う場合はbetweenが簡単で良いと思います。

SQL

1SELECT sum_year as T_DATE ,user_cnt as M_NO 2FROM t_sumlist 3WHERE sum_date between '2010-10-31' and (date '2016-10-31' + INTERVAL '2 YEAR')::date;

追記を受けて

日付の計算は型がdateやtimestampなど決まっていれば、正しく指定すればプログラム側が上手いことやってくれます(特異な場合はある程度調整が必要ですが)
date型でデータをおさめているのであればdate型を使った方がすっきり組めることが多いと思いますよ。

SQL

1-- 3ヶ月間 2WHERE sum_date between '2010-10-31' and (date '2016-10-31' + INTERVAL '3 MONTH')::date; 3-- 10日間 4WHERE sum_date between '2010-10-31' and (date '2016-10-31' + INTERVAL '10 DAYS')::date;

投稿2017/06/12 02:04

編集2017/06/12 02:37
m.ts10806

総合スコア80765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pro-poke5

2017/06/12 04:37

無事できました ありがとうございました! 他の方々もありがとうございました
guest

0

年でintなので単純に足す事ができます

psql

1SELECT sum_year as T_DATE ,user_cnt as M_NO 2FROM t_sumlist 3WHERE sum_month = 12 4AND sum_day = 31 5AND sum_year >= 2010 6AND sum_year <= 2010 + 2;

intervalをお使いになるならdate(YYYYMMDD),timestampにしてあげればできます。
intervalで2年後を作成後、年の部分だけ取り出してintにキャストしています。
結果的には上と一緒になります。

SELECT sum_year as T_DATE ,user_cnt as M_NO FROM t_sumlist WHERE sum_month = 12 AND sum_day = 31 AND sum_year >= 2010 AND sum_year <= to_char(date '20100101' + INTERVAL '2 YEAR','YYYY')::int;

同じ具合で何か月後、何日後はsum_dateを使うべきでしょうか?

日付に関する計算は、date属性を使った方が間違いが少なくて済みます。
数値でも日付に変換すれば日付と同じ様に使えます。

sql

1select * from t_sumlist 2 where sum_date=(sum_year ||'-'|| sum_month ||'-'|| sum_day)::date;

投稿2017/06/12 01:51

編集2017/06/12 03:47
A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

INTERVALは日付の和や差につかうものなので
yearを2年後にしたいならたんに
AND sum_year <= (2010 + 2)
でよいのでは?

投稿2017/06/12 01:27

yambejp

総合スコア114572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問