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

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

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

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

Q&A

解決済

2回答

5583閲覧

SQLの日付フィルタ

kuriya

総合スコア35

SQL

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

0グッド

1クリップ

投稿2017/06/12 02:35

編集2017/06/12 03:05

DBに入っている日付のデータが年、月、日で別々のカラムに入っています。
DBはMySQLを使っています。

ex:

start_year =>2016 start_month =>6 start_day =>18 end_year => 2017 end_month => 7 end_day => 25

postで
$_POST['start_date']=>2016-06-22
$_POST['end_date']=>2017-07-28

こんな感じでデータが渡されるので
WHERE start_date BETWEEN '2016-06-22' AND '2017-07-28'
AND end_date BETWEEN '2016-06-22' AND '2017-07-28'
みたいな感じで絞り込みたいのですがstart_date(date型)が無く、
年、月、日が別々のカラムに入っています。
DBのカラムの増やすなどは出来ません。

sql特な方、教えてください。

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

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

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

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

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

m.ts10806

2017/06/12 02:49

DBの種類、それぞれのカラムの型をご提示ください。あとどのようにフィルタしたいかも。
Orlofsky

2017/06/12 02:53

どうフィルタしたいのでしょうか?そもそも年、月、日が別々のカラムって設計が悪過ぎます。テーブル設計してこれから開発するならdate型に変更されては?
kuriya

2017/06/12 03:06

matsu1006 ご指摘ありがとうございます。修正いたしました。
kuriya

2017/06/12 03:08

Orlofsky どうフィルタしたいか追記しました。テーブル設計が悪すぎるのですが、テーブル設計を変えずに実装しなければならないのです涙
daive

2017/06/12 03:10

もし、Windows であれば、NativeClient/ODBC/OLEDBの別も追記して下さい。フィールド(カラム)の追加が可能であれば、日付型(date型)を追加しますけどねぇ。パフォーマンス考慮外で、とりあえずViewで日付に変えてしてしまうとか。
Orlofsky

2017/06/12 03:11

この作業が終わったら職場を変わるとして、各列のデータ型がわかるようにcreate table文を提示されては?
guest

回答2

0

設計を変えられないんでしょうかね?

SQL

1SELECT *, 2 DATE(CONCAT_WS('-', start_year, start_month, start_day)) AS start_date, 3 DATE(CONCAT_WS('-', end_year, end_month, end_day)) AS end_date 4FROM テーブル名 5WHERE start_date BETWEEN '2016-06-22' AND '2017-07-28' 6AND end_date BETWEEN '2016-06-22' AND '2017-07-28'; 7```速度が心配ですけどね。

投稿2017/06/12 03:11

編集2017/06/12 03:16
shi_ue

総合スコア4437

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

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

0

ベストアンサー

MySQLである前提で
startが2016-6-18以降で、endが2017-7-25までのデータを取得するイメージで書けば

WHERE DATE_FORMAT( CONCAT_WS('-', start_year, start_month, start_day), "%Y-%m-%d" ) >= '2016-06-18' and DATE_FORMAT( CONCAT_WS('-', end_year, end_month, end_day), "%Y-%m-%d" ) <= '2017-7-25'

ついでに、MySQLにはgenerated columnという便利なモノがありまして、他のcolumnを使って仮想的なcolumnを作る事が出来るんですよ。
今回のような件だとうってつけだと思うので、是非Document見てみてください。

投稿2017/06/12 03:08

編集2017/06/12 03:10
kunai

総合スコア5405

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

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

kuriya

2017/06/12 03:28

皆様ありがとうございました。 思い通りのフィルタが出来ました。 感謝!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問