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

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

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

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

Java

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

SQL

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

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

2582閲覧

SQLを用いてデータを日付で範囲指定して抽出したい

asahiko123

総合スコア43

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

Java

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

SQL

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

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2021/09/26 06:44

前提・実現したいこと

イメージ説明

上記のような入力欄から日付で範囲指定したデータの抽出をしたいです。
なお、テーブルには以下のデータが入っている状態です。
![イメージ説明

例えば、2021-09-20~2021-09-25と検索するとid = 1のデータのみを取り出せるような
動きを意図しています。

そこで下記に示すsql文を書いたのですが、うまく動作してくれていません。
その原因を知りたいです。

該当のソースコード

String sql ="SELECT DISTINCT DAILYREPORT.id, DAILYREPORT.type_id, DAILYREPORT.stuff_id, DAILYREPORT.work_id, DAILYREPORT.created, startTime, endTime, DAILYREPORT.detail, DAILYREPORT.name," +" progress FROM DAILYREPORT" +" INNER JOIN DAILYREPORT_TYPE ON DAILYREPORT_TYPE.id = DAILYREPORT.type_id" +" WHERE DAILYREPORT.created BETWEEN \' " +workingHour.getCreated()+ "\'AND\' " + workingHour.getEnd()+ " \' ";

試したこと

workingHour.getCreated(),workingHour.getEnd()にはそれぞれ入力欄から入れた日付がString型で入っています。
イメージ説明
getterで値自体は取得できていることは確認していますが、中身を取り出せてはいないようです。

String sql ="SELECT DISTINCT DAILYREPORT.id, DAILYREPORT.type_id, DAILYREPORT.stuff_id, DAILYREPORT.work_id, DAILYREPORT.created, startTime, endTime, DAILYREPORT.detail, DAILYREPORT.name," +" progress FROM DAILYREPORT" +" INNER JOIN DAILYREPORT_TYPE ON DAILYREPORT_TYPE.id = DAILYREPORT.type_id " +" WHERE DAILYREPORT.created BETWEEN \' " +workingHour.getCreated() + "\' AND\' " +workingHour.getEnd()+ " \' ";   List<Map<String,Object>> resultList = jdbcTemplate.queryForList(sql);  System.out.println(workingHour.getCreated());  System.out.println(workingHour.getEnd()); System.out.println(resultList);

↓実行結果
イメージ説明

where以下を下記にしても同様でした。

+" WHERE DAILYREPORT.created BETWEEN '2021-9-20' AND '2021-9-25' ";

where句を書かない場合は全件取得できているので、やはり条件文の書き方がおかしいような気がしますがどうなのでしょう。

String sql ="SELECT DISTINCT DAILYREPORT.id, DAILYREPORT.type_id, DAILYREPORT.stuff_id, DAILYREPORT.work_id, DAILYREPORT.created, startTime, endTime, DAILYREPORT.detail, DAILYREPORT.name," +" progress FROM DAILYREPORT" +" INNER JOIN DAILYREPORT_TYPE ON DAILYREPORT_TYPE.id = DAILYREPORT.type_id ";   List<Map<String,Object>> resultList = jdbcTemplate.queryForList(sql);  System.out.println(workingHour.getCreated());  System.out.println(workingHour.getEnd()); System.out.println(resultList);

↓実行結果
イメージ説明

補足情報(FW/ツールのバージョンなど)

Java11
spring boot
spring tool suite

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

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

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

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

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

m.ts10806

2021/09/26 07:04

コードが一部過ぎて何とも言えまんが、 workingHourはどういう定義になっているのでしょうか。 また、直に値を入れるのではなく、プリペアドステートメントからバインドした場合はどうでしょうか。
cx20

2021/09/26 07:29

DAILYREPORT テーブルの「CREATED」列の型は何でしょうか?文字型になっていたりしませんか?
guest

回答1

0

ベストアンサー

String sql =...の部分だけ抜き出してみた。他は見ていない。

java

1import java.time.LocalDate; 2 3public class xxHogeSQL { 4 static class Data { 5 public String getCreated() { 6 return LocalDate.now().toString(); 7 } 8 9 public String getEnd() { 10 return LocalDate.now().plusDays(10).toString(); 11 } 12 } 13 14 public static void main(final String[] args) { 15 final Data workingHour = new Data(); 16 17 String sql = "SELECT DISTINCT DAILYREPORT.id, DAILYREPORT.type_id, DAILYREPORT.stuff_id, DAILYREPORT.work_id, DAILYREPORT.created, startTime, endTime, DAILYREPORT.detail, DAILYREPORT.name," 18 + " progress FROM DAILYREPORT" 19 + " INNER JOIN DAILYREPORT_TYPE ON DAILYREPORT_TYPE.id = DAILYREPORT.type_id " 20 + " WHERE DAILYREPORT.created BETWEEN \' " + workingHour.getCreated() + "\' AND\' " + workingHour.getEnd() + " \' "; 21 22 System.out.println(sql); 23 } 24} 25

結果はこのとおり(改行は適当に入れている)。

SELECT DISTINCT DAILYREPORT.id, DAILYREPORT.type_id, DAILYREPORT.stuff_id, DAILYREPORT.work_id, DAILYREPORT.created, startTime, endTime, DAILYREPORT.detail, DAILYREPORT.name, progress FROM DAILYREPORT INNER JOIN DAILYREPORT_TYPE ON DAILYREPORT_TYPE.id = DAILYREPORT.type_id WHERE DAILYREPORT.created BETWEEN ' 2021-09-26' AND' 2021-10-06 '

getCreated()がそれなりの値を返したとしても、期待した結果を取得できるとは、おもえない。どーみても、よけーな空白がある。から。

投稿2021/09/26 09:01

shiketa

総合スコア4061

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

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

asahiko123

2021/09/26 09:53

ご回答ありがとうございました。空白を詰めたところ意図どおり動きました。
shiketa

2021/09/26 11:09

趣味興味の範囲を超えて、きちんとしたシステムの構築を目指すのであれば、SQLインジェクション対策を施すことをおすすめしておきます。 https://www.google.com/search?q=sql+injection+java 老婆心ながら。
asahiko123

2021/09/27 02:27

ありがとうございます。インジェクション対策もおこなってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問