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

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

ただいまの
回答率

90.98%

  • データベース

    627questions

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

  • SQL Server

    509questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 338

bons

score 1

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

です。

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

  1. 必要な日付の最小から最大までのリストをCTEで生成
  2. 条件を満たすものを exists で抽出
-- campaignテーブルが一時テーブルになっていますが、適宜読み替えてください。
/*
create table #campaign (
 日付1    date
,日付2    date
)
insert into #campaign
select '2017-11-02','2017-11-07' union all
select '2017-10-05','2017-10-08' union all
select '2017-11-09','2017-11-09' union all
select '2017-11-03','2017-11-03'
*/
declare
 @date_begin date=(select min(case when 日付1<日付2 then 日付1 else 日付2 end) from #campaign)
,@date_end   date=(select max(case when 日付1<日付2 then 日付2 else 日付1 end) from #campaign)
;
with date_list as (
    select
        @date_begin 日付
    union all
    select
        dateadd(d,1,日付) 日付
    from
        date_list
    where
        日付<@date_end
)
select
    *
from
    date_list d
where
    exists (
        select
            *
        from
            #campaign c
        where
            d.日付 between c.日付1 and c.日付2
    )
order by d.日付
option (maxrecursion 10000)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/07 11:49

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

    キャンセル

-1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/07 10:20

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

    2017/11/04
    2017/11/05
    2017/11/06も取得したいということです。

    キャンセル

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

  • ただいまの回答率 90.98%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • データベース

    627questions

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

  • SQL Server

    509questions

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