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

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

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

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

2回答

3301閲覧

SQL Server2014で、日付のFrom~Toの期間の日付を全て取得したい

bons

総合スコア9

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2017/11/07 00:44

編集2017/11/07 01:22

SQL Serverのあるテーブルに日付のFromとToが登録されていて、その範囲の日付を全て取得したいです。

例)

SELECT 日付1,日付2
FROM campaign

この結果が、

日付1 日付2
1:2017/11/02 2017/11/07
2:2017/10/05 2017/10/08
3:2017/11/09 2017/11/09
4:2017/11/03 2017/11/03

このように複数のデータがあり、それぞれの日付の範囲にある日付を全て取得したいです。

各行の日付が被っている場合は、結果はdistinctで良いです。

上記の例であれば、2017/11/03は1行目と3行目で被っていますが、
理想的な日付取得結果は

2017/10/05
2017/10/06
2017/10/07
2017/10/08
2017/11/02
2017/11/03
2017/11/04
2017/11/05
2017/11/06
2017/11/07
2017/11/09

です。

方法を教えていただければと思います。
よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

以下の手順で、どうでしょうか。

  1. 必要な日付の最小から最大までのリストをCTEで生成
  2. 条件を満たすものを exists で抽出

sql

1-- campaignテーブルが一時テーブルになっていますが、適宜読み替えてください。 2/* 3create table #campaign ( 4 日付1 date 5,日付2 date 6) 7insert into #campaign 8select '2017-11-02','2017-11-07' union all 9select '2017-10-05','2017-10-08' union all 10select '2017-11-09','2017-11-09' union all 11select '2017-11-03','2017-11-03' 12*/ 13declare 14 @date_begin date=(select min(case when 日付1<日付2 then 日付1 else 日付2 end) from #campaign) 15,@date_end date=(select max(case when 日付1<日付2 then 日付2 else 日付1 end) from #campaign) 16; 17with date_list as ( 18 select 19 @date_begin 日付 20 union all 21 select 22 dateadd(d,1,日付) 日付 23 from 24 date_list 25 where 26 日付<@date_end 27) 28select 29 * 30from 31 date_list d 32where 33 exists ( 34 select 35 * 36 from 37 #campaign c 38 where 39 d.日付 between c.日付1 and c.日付2 40 ) 41order by d.日付 42option (maxrecursion 10000)

投稿2017/11/07 02:19

alg

総合スコア2019

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

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

bons

2017/11/07 02:49

ありがとうございます! 解決しました助かりました!
guest

0

select distinct 日付 from ( select 日付1 as 日付 from campaign union select 日付2 as 日付 from campaign ) order by 日付

…こんな感じでいけるんでは?

投稿2017/11/07 00:50

tkturbo

総合スコア5572

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

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

bons

2017/11/07 01:20

質問文の理想的な日付取得結果の部分に書いたとおり、 日付1フィールドと日付2フィールドの間の範囲も取得したいということなので、 例だと 2017/10/06 2017/10/07 と 2017/11/04 2017/11/05 2017/11/06も取得したいということです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問