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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

1627閲覧

Java DBにTimestamp型で格納したデータの取り出し方を教えて頂けないでしょうか。

asameshi

総合スコア16

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2019/09/30 13:50

編集2019/10/01 08:08

Java初学者です。
サイコロを作っておりまして、ログをDBに格納、取り出して表示、という機能を実装しています。
現在ログの検索機能を実装しようとしています。

DBのテーブルにはtimeカラムと、numberカラムがあり、
今回はTimestamp型のtimeに格納されているデータの日付を参照して取得したいです。

jspでformタグを使い、servletで入力されたデータの取得はできています。

入力するデータは、日付のみです。
例)「7」入力 => 7日のログを出力

どうかお力を貸して頂けないでしょうか。
よろしくお願い致します。

追記

不明点
・日付での検索方法
・日付検索のSQL

DBはpostgreSQLを使用しています。
現在のDAOとservletは下記のようになっています。

servlet

     //jspから入力データを取得 String date = request.getParameter("date"); DateFormat sdf = new SimpleDateFormat("dd"); List<Map<String, Object>> logList = null; try { Timestamp d = new Timestamp(sdf.parse(date).getTime()); logList = diceDao.searchDiceLog(d); } catch (Exception e) { e.printStackTrace(); } request.setAttribute("log",logList); String path = "index.jsp"; RequestDispatcher dispatcher = request.getRequestDispatcher(path); dispatcher.forward(request,response);

Dao

public List<Map<String, Object>> searchDiceLog(Timestamp date) throws Exception { try { List<Map<String, Object>> list = new ArrayList<>(); Map<String, Object> map = new HashMap<>(); DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");                //DB接続 Class.forName("org.postgresql.Driver"); conn = DriverManager.getConnection(url,user,password); conn.setAutoCommit(false); stmt = conn.createStatement();                //データ取得 String sql = "SELECT number,time FROM dice_log WHERE time = ? ORDER BY time DESC"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setTimestamp(1,date);   rs = pstmt.executeQuery(); while (rs.next()) { map = new HashMap<>(); map.put("number",rs.getInt(1)); map.put("time",dateFormat.format(rs.getTimestamp(2))); list.add(map); } return list; }

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

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

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

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

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

dodox86

2019/09/30 17:10

色々と情報が足りない気がします。例えば以下のような点を明示すると回答を得やすくなると思います。(今のままですと、丸投げに近いです) ・「ログをDBに格納、取り出して表示、という機能を実装していて」とあるが、格納と取り出しは既にできていて、「検索」ができないのか。  (つまり、DBへのアクセスはできているけど、日付での検索方法が分からないのか) ・DBは何なのか。(oracle ? mysql? postgres?) ・JDBCを使っているのか、使っていないのか?使い方を含めて分からないのか。 ・検索の為のSQLが分かればいいのか。 ・上記の一部が分からないのか、あるいは全て分からないのか。 ・実際のJavaのコードでは、どこまで自分でできているのか。(DBアクセス部分のコードの提示)
asameshi

2019/10/01 01:19

ご指導頂きありがとうございます。 現在のコードなどを追記しました。 質問の仕方を学び、より良いエンジニアになれるように頑張ります。
dodox86

2019/10/01 03:04

loadDiceLog と searchDiceLog は実は同じものでしょうか。
asameshi

2019/10/01 04:07

同じものです。 申し訳ありません、修正します。
dodox86

2019/10/01 06:30

現時点のコードで結構完成していると思うのですが、もしかするともとのコードは別の方が作られたのでしょうか。(ここまで本人が書けているなら、追加もそれほど大変なことには思えないので)
asameshi

2019/10/01 07:29 編集

このコードは自分が書いたものです。ただ、ググりながらなんとか書いたもので、完全に理解できていない箇所もあります。 先ほどコードを改善し、servletで受け取ったデータを、Timestamp型でDAOに受け渡しました。しかし、そこからのSQLでの検索が上手く行かず悩んでいました。(本文中のコード修正済み)
tetutetu

2019/10/01 07:37

>SQLでの検索が上手く行かず 何が原因で「上手く行かない」かは、コンソールに出力されます。 そこを見て、何故か考えてみてください。 それでも何故か理解できなかった場合、エラー文を質問欄に追記してください。
tetutetu

2019/10/01 07:57 編集

というか、DAO内に明らかに一点エラーを吐きそうな場所が見受けられるのですが 赤い×印等(Eclipse等の場合)が表示されていませんか? 追記:その行、まだエラー吐いてませんか?そしてその真上もエラー吐いてませんか?
asameshi

2019/10/01 07:58 編集

DAO内の rs = pstmt.executeQuery(); この部分は修正しました。 何度か手を加えていたため、こちらのコードに反映できていませんでした。申し訳ありません。 現在エラーは出てない状況です。
tetutetu

2019/10/01 08:00

Connection、ResultSetの宣言が見当たらず、変数(conn rs)のみになっていますが 実際のコードには宣言が存在するのでしょうか。
tetutetu

2019/10/01 08:01

そして、当初意図してたのはこの部分↓なのですが pstmt.String(1,date); 本当にエラー吐いていませんか?
dodox86

2019/10/01 08:06

try ~ catch()で例外を捕捉したり、エラー内容を出力していないので、エラーが発生しても上位にthrowされているのに気が付いていないかもしれません。
asameshi

2019/10/01 08:08 編集

Connection、ResultSetの宣言はメソッド外で宣言しております。 またコメント頂いた部分ですが、 pstmt.String(1,date); => pstmt.setTimestamp(1,date); と変更しておりました。反映漏れが多くあり、余計な時間をかけてしまい申し訳ありません
tetutetu

2019/10/01 08:09

そこまでを一度質問欄に反映させた上で 現在発生している問題を見つけましょう。
dodox86

2019/10/01 08:31

SQLに関して一例として回答しましたが、tetutetuさんの書かれている「自分で考えること」が一番大事だと思いますので、引き続きがんばってください。
guest

回答1

0

ベストアンサー

「日付検索のSQL」について途中まで書いてしまっていたので放流します:

dice_logテーブルのtimeカラムに対して「日」で抽出するSQLの一例です。
DATE_PART関数で日だけ取り出し、2日に合致したものを逆順でソートした結果を返します。

SQL

1SELECT * FROM dice_log WHERE DATE_PART('day', time) = 2 ORDER BY time DESC;

PostgreSQL 7.2.3 ユーザガイド - 4.8. 日付/時刻関数と演算子

psqlコマンドでの実行例です。dice_logテーブルをとりあえず以下のようなものだと仮定してます。

postgres=# \d dice_log テーブル "public.dice_log" 列 | 型 | 照合順序 | Null 値を許容 | デフォルト --------+-----------------------------+----------+---------------+------------ number | integer | | | time | timestamp without time zone | | |

dice_log テーブルの内容は以下です。

postgres=# -- 全件 SELECT * FROM dice_log; number | time --------+--------------------- 1 | 2019-07-01 01:00:01 2 | 2019-07-02 01:00:03 3 | 2019-08-01 01:00:01 4 | 2019-08-02 01:00:01 5 | 2019-09-01 01:00:05 6 | 2019-09-23 01:00:04 7 | 2019-09-12 01:00:03 8 | 2019-10-01 01:00:01 (8 行) postgres=#

postgresのDATE_PART関数でdayのみ取り出して、2日のもののみ抽出します。2件のレコードセットが返されます。

postgres=# SELECT * FROM dice_log WHERE DATE_PART('day', time) = 2 ORDER BY time DESC; number | time --------+--------------------- 4 | 2019-08-02 01:00:01 2 | 2019-07-02 01:00:03 (2 行) postgres=#

これをPreparedStatementに適合させれば動くとは思います。※動作未確認です

JavaのTimestampクラスオブジェクトとのやり取りは、考えてみてください。もちろん、SQLは上記のものだけとは限らないので、一例として。

投稿2019/10/01 08:28

dodox86

総合スコア9183

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

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

dodox86

2019/10/01 08:40

ちなみにTIMEZONEの意識は入れていません。そんなにシビアな案件の話ではないと思いますが、UTCとローカル時間(JST)で日付が重なる(ズレる)ので、そこは別途、必要に応じて適切に対応してください。
asameshi

2019/10/01 10:28

今回はご丁寧に対応頂きありがとうございます。 先ほど、コード修正したところ、思い通りの出力ができました。 servletで受け取った日付を、数値に変換し、数値のままDAO渡しました。 受け取った引数を、頂いたSQL文にセットし取得しました。 無理にTimestampを使わなくても方法があるんだなぁと、 勉強不足を実感しました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問