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

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

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

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

Q&A

解決済

3回答

1655閲覧

SQL 「期間中」のデータを抽出する方法

MaoT

総合スコア5

SQL

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

0グッド

0クリップ

投稿2020/02/20 00:19

「期間中」のデータを抽出したいのですが、記述の仕方が分かりません。

【Table_A】
ID,Start_Date,End_Date
A0001,2020-01-01,2020-05-31
A0002,2020-01-10,2020-01-31
A0003,2020-02-01,2020-02-29
A0004,NULL,2020-03-31
A0005,2019-12-31,2020-03-31
A0006,2020-1-05,NULL
A0007,NULL,NULL

Start_DateとEnd_Dateの間は稼働中と考え、稼働中のデータを抽出したいです。
※Start_Date,End_Dateは構成をNot Nullには出来ません。

対象期間:2020-01-01 ~ 2020-01-31
・Start_Date,End_DateどちらもNULLの場合は抽出しない
・Start_Date,End_DateどちらかがNULLの場合判断のしようがないので、
CASE WHEN Start_Date(End_Date) IS NULL THEN....を用いて最小日・最大日へ置き換えして稼働中であれば抽出する

抽出対象期間を上の様にした時、得たい結果は下の通りです。
A0001,2020-01-01,2020-05-31
A0002,2020-01-10,2020-01-31
A0004,NULL,2020-03-31
A0005,2019-12-31,2020-03-31
A0006,2020-1-05,NULL

BETWEENではA0001のようなデータが抽出できないし、そもそも「期間中」であるかをどう判断していいのかが分かりません。
どう記述したら希望の結果が得られるのか、ご教示下さい。

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

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

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

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

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

yambejp

2020/02/20 00:39

SQLの種類はなんでしょう? null関連の関数はSQLによって微妙に違うと思います
Orlofsky

2020/02/20 01:26

テーブル定義はCREATE TABLEに、テーブル中のデータはINSERTに訂正できたほうが的確なコメントが付き易いです。
Orlofsky

2020/02/20 01:27

同じSQLでもデータベースやそのバージョンによって方言が大きいですから、どのデータベースを使うのかを質問のタグで示したり、バージョンも明記した方が適切なコメントが付き易いです。
MaoT

2020/02/20 03:18

コメントありがとうございます。 データベースはAzure SQL Serverを使用しています。 今後はきちんと記載する様に致します。 早速これから頂いたご回答を元に検証してみます。
guest

回答3

0

ベストアンサー

希望する条件をべたに展開すると以下になります。

SQL

1select * from Table_A 2where Not(start_date is null and end_date is null) 3 and (start_date <= '2020-01-31' or start_date is null) 4 and (end_date >= '2020-01-01' or end_date is null)

投稿2020/02/20 00:54

sazi

総合スコア25327

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

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

MaoT

2020/02/20 04:23

こちらでやりたかった事が完璧に出来ました。 なるほどこうやって指定してあげるのですね。 色々なところで役立ちそうです、しっかり覚えておきます。 とても助かりました、ありがとうございました。
guest

0

mysqでやるとこう

投稿2020/02/20 00:53

yambejp

総合スコア116724

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

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

yambejp

2020/02/20 00:57 編集

set @s:='2020-01-01',@e:='2020-01-31'; select * from tbl where 0 or (Start_Date between @s and @e) or (End_Date between @s and @e) or (@s between coalesce(Start_Date,'0000-01-01') and coalesce(End_Date,'9999-12-31') and (Start_Date is not null or End_Date is not null))
guest

0

とりあえず、NULLを無視する場合、条件はstart_date <= '2020-01-31' AND end_date >= '2020-01-01'となります。

投稿2020/02/20 00:25

maisumakun

総合スコア146018

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

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

maisumakun

2020/02/20 00:30 編集

NULLを考慮しても、(start_date IS NULL OR start_date <= '2020-01-31' ) AND (end_date IS NULL OR end_date >= '2020-01-01')でいけますね(ただし、両端NULLのものにもヒットする)。
maisumakun

2020/02/20 00:37

なお、start_date > end_dateとなる異常値がないことは前提です。
MaoT

2020/02/20 04:31

ご回答ありがとうございます。 異常値の前提、ありがとうございます。入力時にチェックさせるようにしたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問