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

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

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

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

SQL

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

Q&A

解決済

2回答

4057閲覧

日付期間の重複レコード取得について

ktamon

総合スコア35

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

SQL

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

0グッド

0クリップ

投稿2018/07/07 08:47

編集2018/07/07 10:54

前提・実現したいこと

Accessのクエリで特定のテーブルからレコード抽出を行おうと考えております。
条件としては、
製品    有効開始日    有効終了日
A      20170101     20180501
A      20180502     99999999
B      20180301     99999999
と言う形で世代管理を有効開始日・終了日で行っているテーブルになります。
※すいません、この構造自体は変更したいのは山々ですが変更できない状態です。

このテーブルから期間の重複レコードの抽出を行いたいです。
製品    有効開始日    有効終了日
A      20170101     20180501
A      20180402     20180507
A      20180508     99999999
B      20180301     99999999
上記の場合、
A      20170101     20180501
A      20180402     20180507
を重複レコードとして判断したいと考えています。

色々試して、

SELECT D1.data_cd ,D1.data_name ,D1.from_date ,D1.to_date FROM test_mast as D1 ,test_mast as D2 WHERE D1.data_cd = D2.data_cd AND( ( D1.from_date > D2.from_date AND D1.to_date < D2.to_date ) OR ( D1.to_date > D2.from_date AND D1.from_date < D2.to_date )) AND ( D1.from_date <> D2.from_date OR D1.to_date <> D2.to_date ) ORDER BY D1.data_cd ,D1.from_date ,D1.to_date

テーブル定義ですが、
data_cd Varchar2(6):製品コード
D1.data_name  Varchar2(20):製品名称
D1.from_date Varchar2(8):有効開始日
D1.to_date   Varchar2(8):有効終了日

となります。
等試していますがうまく行ってない状態です。
ご助言いただけないでしょうか?

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

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

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

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

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

guest

回答2

0

テーブルに主キーがないと面倒なので、オートナンバー型の主キー id を追加して下記のようなテーブルとします。data_name は正規化から外れるのでとりあえず無視します。

テーブル名 test_mast

iddata_cdfrom_dateto_date
1A2017010120180501
2A2018040220180507
3A2018050899999999
4B2018030199999999

下記のSQLで希望の結果になります。

sql

1SELECT 2 D1.* 3FROM 4 test_mast AS D1 INNER JOIN test_mast AS D2 5 ON D1.data_cd = D2.data_cd 6WHERE 7 D1.id<>D2.id 8 AND D1.from_date<D2.to_date 9 AND D1.to_date>D2.from_date;

出力結果

iddata_cdfrom_dateto_date
1A2017010120180501
2A2018040220180507

参考リンク
クエリでの期間の抽出条件 - hatena chips
クエリで時間帯重複チェック - hatena chips

投稿2018/07/08 06:06

編集2018/07/08 06:25
hatena19

総合スコア33715

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

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

ktamon

2018/07/08 06:28

ありがとうございます、試してみます。 また、サンプルに誤りがありましたが読み替えていただき助かりました。 今後は気をつけます。
guest

0

ベストアンサー

質問に載っているがデータの表示されている例がdata_cdかdata_nameかわかりません。
Accessの環境がないので動作確認していません。

SQL

1select 2 tm.data_name 3 , tm.from_date 4 , tm.to_date 5from test_mast tm 6inner join 7 ( 8 select 9 tm.data_cd 10 , min(tm.from_date) as min_from_date 11 , min(tm.to_date) as min_to_date 12 , max(tm.from_date) as max_from_date 13 , max(tm.to_date) as max_to_date 14 from test_mast tm 15 group by 16 tm.data_cd 17 ) a 18on tm.data_cd = a.data_cd 19and tm.from_date in(a.min_from_date, a.max_from_date) 20and tm.to_date in(a.min_to_date, a.max_to_date) 21order by 22 tm.data_name 23 , tm.from_date 24 , tm.to_date ;

投稿2018/07/07 14:18

Orlofsky

総合スコア16415

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

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

ktamon

2018/07/08 06:28

Accessのクエリに貼って確認させていただきます、ありがとうございます。 もう少し例等を詳細に今後は記載するようにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問