今日の誕生日と今後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)))
オーダー誕生日;
私はちょうど最初の部分を使って "間"の条件を追加しましたが、重複した結果が得られました。私は何かを逃したかもしれないかもしれませんが、連合とのこれらの解決策でうまくいきます。
を?それは、SYSDATEが年末に近いほど面倒だと思います。とにかく(言葉で)要件は何ですか? – mathguy
ソリューションが非常に単純な場合は、不要な構造を多すぎて使い果たしただけです。 –
私はまだよく分かりません。私は誕生日として29日を含む日付を追加し、結果を見てみようと思います。私たちがうるう年になったときを計算するケースがあるのではないかと疑問に思う。 – AWildmann