2017-11-28 4 views
0

今日の誕生日と今後4日間の誕生日を持つテーブル内のすべての人の名前と誕生日を取得できるselectを作成しようとしています。年が変わったときのsysdateの問題

私は理論的に動作し、この非常にハードコーディングされたとロングコード、で最初に開始:このクエリの問題はいつでも、「今日、それはまた、月の開始日を持つ人々を示すことである

select name, birthday from 
    (select name, birthday, to_date('DD-MM-YYYY') as today from user_table) 
where (extract(month from(birthday)) = extract(month from(today)) 
    or extract(month from(birthday)) = extract(month from(today+1)) 
    or extract(month from(birthday)) = extract(month from(today+2)) 
    or extract(month from(birthday)) = extract(month from(today+3)) 
    or extract(month from(birthday)) = extract(month from(today+4))) 
and (extract(day from(birthday)) = extract(day from(heute)) 
    or extract(day from(birthday)) = extract(day from(today+1)) 
    or extract(day from(birthday)) = extract(day from(today+2)) 
    or extract(day from(birthday)) = extract(day from(today+3)) 
    or extract(day from(birthday)) = extract(day from(today+4))) 
order by extract(month from(birthday)) asc, extract(day from(birthday)) asc 

変数は例えば月の最後の日です。

少しこのクエリを変更し、機能「間」を使用していた私に示唆された一つの解決策:

select name, birthday from 
    (select name, birthday, to_date('DD-MM-YYYY') as today from user_table) 
where (extract(month from(birthday)) between extract(month from(today)) and extract(month from(today+4))) 
and (extract(day from(birthday)) between extract(day from(today)) and extract(day from(today+4))) 
order by extract(month from(birthday)) asc, extract(day from(birthday)) asc 

けれども、私はでこれを実行すると、「31-12-2017」、と言う、いつでも年または月が変わると、結果は返ってきません。

add_months関数を使用して現在の「今日」の日付を「バーティー日」に戻すように、より重い計算を試みました。したがって、日と月を確認するために余分な条件を使用する必要はありません。 しかし、決して日付を正しく返すことはありません(月/年の最終日の場合)。

select name, birthday, add_months(today, -month_difference) as today_minus_difference from 
    (select name, birthday, today, floor(months_between(today, birthday)) as month_difference from 
    (select name, birthday, to_date('DD-MM-YYYY') as today from table_users) 
) 
where birthday between add_months(today, -month_difference) and add_months(today+4, -month_difference) 
order by extract(month from(birthday)) asc, extract(day from(birthday)) asc; 

は私がbetween機能から欠けているものがあります:これは私が作ったコード例ですか?月または年が変更された場合、betweenの日付は計算できませんか?あるいは、私は論理に何か他のものを見逃していますか?

EDIT:閏年をどのように処理したのか尋ねられた人もいますが、ここでは最後の質問があります。私はそれが改善できると確信していますが、それは両方のケース(年の変更と閏年)に働きました。

select name, birthday 
from users 
    (select to_date(input_date) + rownum - 1 as today from dual connect by level <=5) 
where to_char(birthday, 'dd.mm') = to_char(today, 'dd.mm') 
union 
select name, birthday 
from users 
    (select to_date(input_date) as today from dual) 
where where to_char(birthday, 'dd.mm') = to_char(today, 'dd.mm') 
or birthday between (add_months(today, -((extract(year from(today)) - extract(year from(birthday)))*12))) 
and (add_months(today+4, -((extract(year from(today)) - extract(year from(geburtstag)))*12))) 

オーダー誕生日;

私はちょうど最初の部分を使って "間"の条件を追加しましたが、重複した結果が得られました。私は何かを逃したかもしれないかもしれませんが、連合とのこれらの解決策でうまくいきます。

+1

を?それは、SYSDATEが年末に近いほど面倒だと思います。とにかく(言葉で)要件は何ですか? – mathguy

+0

ソリューションが非常に単純な場合は、不要な構造を多すぎて使い果たしただけです。 –

+0

私はまだよく分かりません。私は誕生日として29日を含む日付を追加し、結果を見てみようと思います。私たちがうるう年になったときを計算するケースがあるのではないかと疑問に思う。 – AWildmann

答えて

2

私はシンプルな&明確に存在している間、あなたがハードな方法を選択推測:2月29日の誕生日をどのように処理するかを

select 
    name, 
    birthdate 
from 
    user_table, 
    (select sysdate + rownum - 1 check_date from dual connect by level <= 5) 
where 
    to_char(birthdate, 'dd.mm') = to_char(check_date, 'dd.mm') 
+2

まあ、... 2月29日に生まれた人はいつ誕生日を祝うのですか? –

+0

これは素晴らしい質問です。ありがとうございます。私は確信していません、どのように著者が答えますが、それは間違いなくケアをする必要があります。 –

+0

素晴らしい、それは働いた。私はコードのすべての部分を理解しようとしていますが。 rownumと接続レベル<= 5は、sysdate + 4からselectを実行するためのものですか? 私はこれらの機能に精通していないので、私はそれらをよりよく理解しようとしています – AWildmann

関連する問題